Blog Of Leung

personal blog & work notes

View project onGitHub
 

viewpager中播放动画

Android中可以使用viewpager实现页面的滑动,比如引导页的广告,就大量使用了ViewPager。 官方的教程中使用的都是图片,这里,实现滑动页面中可以播放动画的效果。

新建工程,在主layout中添加viewpager

在这里,最上面是Android Studio默认的TextView,留着不管,中间是ViewPager, 最下面是一个线性布局,这个布局将用来放底部指示页面的小圆点。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<TextView
android:id="@+id/textview1"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textview1"
android:layout_above="@+id/ll_pager_num"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>

<LinearLayout
android:id="@+id/ll_pager_num"
android:layout_width="wrap_content"
android:layout_height="16dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal">
</LinearLayout>
</RelativeLayout>

设计viewpager的布局

这里,只是放了一个ImageView,用来展示动画,指定好ImageView的background属性,指定自己需要的动画文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/pager_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:background="@drawable/scan_animate"/>
</RelativeLayout>

如上是viewpager_1.xml的布局,可以依此继续写出viewpager_2.xml,viewpager_3.xml,这里将使用三个viewpager。

动画xml文件

上面引用了一个帧动画scan_animate,所以需要添加动画xml,以及用到的图片,scan_animate.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"  >
<item android:drawable="@drawable/b1" android:duration="120" />
<item android:drawable="@drawable/b2" android:duration="120" />
<item android:drawable="@drawable/b3" android:duration="120" />
<item android:drawable="@drawable/b4" android:duration="120" />
<item android:drawable="@drawable/b5" android:duration="120" />
<item android:drawable="@drawable/b6" android:duration="120" />
<item android:drawable="@drawable/b7" android:duration="120" />
<item android:drawable="@drawable/b8" android:duration="120" />
<item android:drawable="@drawable/b9" android:duration="120" />
</animation-list>

MainActivity.java代码

package leung.myviewpagerdemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.AnimationDrawable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {
    private AnimationDrawable pagerAnimateDrawable;
    private ImageView pagerAnimateView;
    private View view1,view2,view3;
    private LayoutInflater mLayoutInflater;
    private MyPagerAdapter mPagerAdapter;
    private ArrayList<View> mViewList = new ArrayList<View>();
    private LinearLayout mNumLayout;
    private Button mPreSelectedBt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLayoutInflater = getLayoutInflater();
        //这里使用静态的xml layout,在setConetentView之前先add上
        view1 = mLayoutInflater.inflate(R.layout.viewpager_1, null);
        view2 = mLayoutInflater.inflate(R.layout.viewpager_2, null);
        view3 = mLayoutInflater.inflate(R.layout.viewpager_3, null);
        mViewList.add(view1);
        mViewList.add(view2);
        mViewList.add(view3);
        setContentView(R.layout.activity_main);
        final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        //mNumLayout,这个linearlayout里面准备放底部的小圆点
        mNumLayout = (LinearLayout) findViewById(R.id.ll_pager_num);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dot_normal);
        //根据已添加的viewpager页数动态添加小圆点
        for (int i = 0; i < mViewList.size(); i++) {
            Button bt = new Button(this);
            bt.setLayoutParams(new ViewGroup.LayoutParams(bitmap.getWidth(), bitmap.getHeight()));
            bt.setBackgroundResource(R.drawable.dot_normal);
            mNumLayout.addView(bt);
        }
        //添加viewpager的adapter,把PagerAdapter和ViewPager关联起来
        //MyPagerAdapter是一个内部类,写在了最下面
        mPagerAdapter = new MyPagerAdapter();
        viewPager.setAdapter(mPagerAdapter);
        //viewpager的监听器,我们将在onPageSelected函数执行动画的播放
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {

            if (mPreSelectedBt != null) {
                mPreSelectedBt.setBackgroundResource(R.drawable.dot_normal);
            }
            Button currentBt = (Button) mNumLayout.getChildAt(position);
            currentBt.setBackgroundResource(R.drawable.dot_selected);
            mPreSelectedBt = currentBt;
            //针对不同的页面,播放各自的动画
            if (position == 0) {
                pagerAnimateView = (ImageView) view1.findViewById(R.id.pager_imageview);
                pagerAnimateDrawable = (AnimationDrawable) pagerAnimateView.getBackground();
                pagerAnimateDrawable.start();
            }
            if (position == 1) {
                pagerAnimateView = (ImageView) view2.findViewById(R.id.pager_imageview);
                pagerAnimateDrawable = (AnimationDrawable) pagerAnimateView.getBackground();
                pagerAnimateDrawable.start();
            }
            if (position == 2) {
                pagerAnimateView = (ImageView) view3.findViewById(R.id.pager_imageview);
                pagerAnimateView.setBackgroundResource(R.drawable.scan_animate);
                pagerAnimateDrawable = (AnimationDrawable) pagerAnimateView.getBackground();
                pagerAnimateDrawable.start();
            }
            }

            @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // TODO Auto-generated method stub

                }

            @Override
                public void onPageScrollStateChanged(int arg0) {
                    // TODO Auto-generated method stub

                }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        //当程序初始化完毕,立刻执行动画播放,默认播放第一页
        pagerAnimateView = (ImageView) view1.findViewById(R.id.pager_imageview);
        pagerAnimateDrawable = (AnimationDrawable) pagerAnimateView.getBackground();
        pagerAnimateDrawable.start();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    //内部类,PagerAdapter
    class MyPagerAdapter extends PagerAdapter {

        @Override
        public int getCount() {
                return mViewList.size();
        }

        @Override
        public Object instantiateItem(View container, int position) {
                ((ViewPager) container).addView(mViewList.get(position),0);
                return mViewList.get(position);
        }

        @Override
        public void destroyItem(View container, int position, Object object) {
                ((ViewPager) container).removeView(mViewList.get(position));
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
                return arg0 == arg1;
        }
    }
}

viewpager gif

Author:leung

16 Mar 2016

← Home

comments powered by Disqus