VIewAnimator及其子类

一 ViewAnimator的继承关系

        --FrameLayout 

           --ViewAnimator

                 --ViewSwitcher

                              --imageSwitcher

                              --TextSwitcher

                 --ViewFlipper

说明,ViewAnimator继承FrameLayout,可见它可以将多个View重叠在一起,每次只能显示一个View,当程序控制一个View切换到另一个view,ViewSwitcher支持指定动画效果。

二 仿Launcher界面

       仿Launcher界面使用多个GirdView组合而成,在这里使用ViewSwitcher进行组合GirdView,点击左右按钮实现GridView替换。

1 布局xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ViewSwitcher
        android:id="@+id/view_Switcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <Button
        android:id="@+id/btn_pre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@android:color/transparent"
        android:text="&lt;"/>

    <Button
        android:id="@+id/btn_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@android:color/transparent"
        android:text="&gt;"/>

</RelativeLayout>

2 需要组合的GridView布局

item_vswitcher.xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:numColumns="3"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</GridView>

3 GridView的item布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/item_img_vs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/item_txt_vs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

4 GridView的适配器

public class GridBaseAdapter extends BaseAdapter {
    private int screenNo;
    private Context context;
    private ArrayList<DataItem> items;
    /** 屏幕总数*/
    private int screenCount = 0;
    public GridBaseAdapter(int screenNo, Context context, ArrayList<DataItem> items,int screenCount) {
        this.screenNo = screenNo;
        this.context = context;
        this.items = items;
        this.screenCount = screenCount;
    }

    @Override
    public int getCount() {
        if (items == null){
            return  0;//到最后一屏,且不能整除
        }else if (items.size() % ViewSwitcherActivity.NUMBER_PER_SCREEN != 0
                &&  screenNo == screenCount -1 ){
            return items.size() % ViewSwitcherActivity.NUMBER_PER_SCREEN;
        }else {// 否则返回 NUMBER_PER_SCREEN
            return ViewSwitcherActivity.NUMBER_PER_SCREEN;
        }
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.item_grid,parent,false);
            holder = new ViewHolder();
            holder.img = (ImageView) convertView.findViewById(R.id.item_img_vs);
            holder.txt = (TextView) convertView.findViewById(R.id.item_txt_vs);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.img.setImageDrawable(items.get(position).drawable);
        holder.txt.setText(items.get(position).dataName);

        return convertView;
    }


    static class ViewHolder{
        public ImageView img;
        public TextView txt;
    }

}

5 动画XML文件

left_enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="-100%"
    android:toXDelta="0"
    android:duration="600">
</translate>

left_exit.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="0"
    android:toXDelta="100%"
    android:duration="600"

</translate>   

right_enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="100%"
    android:toXDelta="0"
    android:duration="600">
</translate>

right_exit.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXDelta="0"
    android:toXDelta="-100%"
    android:duration="600">
</translate>

6 使用ViewFactory添加GridView

viewSwitcher = (ViewSwitcher) findViewById(R.id.view_Switcher);
viewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
            @Override
            public View makeView() {
                return LayoutInflater.from(ViewSwitcherActivity.this).inflate(R.layout.item_vswitcher,null);
            }
        });

7 显示第一个屏幕

 //显示第一页
        screenNo ++;
        viewSwitcher.setInAnimation(this,R.anim.left_enter);
        viewSwitcher.setOutAnimation(this,R.anim.left_exit);
        ( (GridView)viewSwitcher.getNextView()).setAdapter(adapter);
        viewSwitcher.showNext();

8 处理btn_pre、btn_next按钮实现GridView切换

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_pre:
                if (screenNo >0){
                    screenNo --;//记录当前屏幕
                    //添加XML动画,右进左出
                    viewSwitcher.setInAnimation(this,R.anim.right_enter);
                    viewSwitcher.setOutAnimation(this,R.anim.right_exit);
                    ( (GridView)viewSwitcher.getNextView()).setAdapter(adapter);
                    viewSwitcher.showPrevious();
                }
                break;
            case R.id.btn_next:
                if (screenNo <= screenCount){
                    screenNo ++;//记录当前屏幕
                    //添加XML动画,左进右出
                    viewSwitcher.setInAnimation(this,R.anim.left_enter);
                    viewSwitcher.setOutAnimation(this,R.anim.left_exit);
                    ( (GridView)viewSwitcher.getNextView()).setAdapter(adapter);
                    viewSwitcher.showNext();
                }
                break;
        }
    }

完整源码点击查看

效果图:



三 imageSwitcher

  imageSwitcher继承了ViewSwitcher,也继承了相应的功能,在View切换时添加动画效果,它重写了ViewSwitcher的showNext、showPrevious的方法,唯一的区别就是在使用ViewFactory创建View时,要求返回的必须是ImageView,如下:

imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
            @Override
            public View makeView() {
                ImageView img = new ImageView(ImageSwitcherActivity.this);
                ImageSwitcher.LayoutParams layoutParams = new ImageSwitcher.LayoutParams(600,600);
                img.setLayoutParams(layoutParams);
                img.setScaleType(ImageView.ScaleType.FIT_XY);
                return img;
            }
        });

      使用示例点击查看

效果图:



四 TextSwitcher

   TextSwitcher类似于ImageSwitcher,继承ViewSwitcher,区别ViewFactory返回的必须是TextView,如下:

 textSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
            @Override
            public View makeView() {
                TextView img = new TextView(ImageSwitcherActivity.this);
                ImageSwitcher.LayoutParams layoutParams = new ImageSwitcher.LayoutParams(
                        ImageSwitcher.LayoutParams.WRAP_CONTENT,ImageSwitcher.LayoutParams.WRAP_CONTENT);
                img.setLayoutParams(layoutParams);
                img.setText("疯狂的小石头");
                return img;
            }
        });

五 ViewFlipper

     ViewFlipper继承了ViewAnimator,它是通过addView添加view,可以实现图片的自动播放,它与AdapterViewFlipper非常相似,不同的地方就是ViewFlipper通过addView添加图片,而AdapterViewFlipper需要通过适配器Adapter添加多个View,直接使用一个简单示例说明下:

1 XML布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ViewFlipper
        android:id="@+id/view_flipper"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/img1"
            android:src="@mipmap/pic_2"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <ImageView
            android:id="@+id/img2"
            android:src="@mipmap/pic_3"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <ImageView
            android:id="@+id/img3"
            android:src="@mipmap/pic_4"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </ViewFlipper>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:orientation="horizontal">
        <Button
            android:text="下一个"
            android:onClick="next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:text="上一个"
            android:onClick="previous"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:text="自动播放"
            android:onClick="auto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

2 实现播放

public class ViewFlipperActivity extends Activity  {
    private ViewFlipper flipper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_flipper);
        flipper = (ViewFlipper) findViewById(R.id.view_flipper);
    }
    public void next(View view){
        flipper.setInAnimation(this,R.anim.left_enter);
        flipper.setOutAnimation(this,R.anim.left_exit);
        flipper.showNext();
        flipper.stopFlipping();
    }
    public void previous(View view){
        flipper.setInAnimation(this,R.anim.right_enter);
        flipper.setOutAnimation(this,R.anim.right_exit);
        flipper.showPrevious();
        flipper.stopFlipping();
    }
    public void auto(View view){
        flipper.startFlipping();
    }
} 

效果图:




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值