Android ViewFlipper翻转视图的基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dpl12/article/details/83149482

前言:

ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放!和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候,用来实现进入应用后的引导页,或者用来图片轮播,本次实现图片轮播功能。

一、为ViewFlipper加入View的两种方式

1、静态导入 

 所谓的静态导入就是像图片这样,把个个页面添加到ViewFlipper的中间!

<ViewFlipper
        android:id="@+id/view_flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inAnimation="@anim/right_in"
        android:outAnimation="@anim/right_out"
        android:flipInterval="3000"><!--每隔3秒切换一个view-->
        <include layout="@layout/page1"/>
        <include layout="@layout/page2"/>
        <include layout="@layout/page3"/>
        <include layout="@layout/page"/>
    </ViewFlipper>

2、动态导入

   通过addView()方法填充View。

viewFlipper=findViewById(R.id.viewFlipper);
viewFlipper.addView(v1);
viewFlipper.addView(v2);
viewFlipper.addView(v3);
viewFlipper.addView(v4);
viewFlipper.startFlipping();

二、常用方法

  • setInAnimation():设置View进入屏幕时使用的动画
  • setOutAnimation():设置View退出屏幕时使用的动画
  • showNext():调整该方法来显示ViewFlipper里的下一个View
  • showPrevious():调整该方法来显示ViewFlipper里的上一个View
  • setFilpInterval():设置View之间切换的时间间隔
  • setFlipping():使用上面设置的时间间隔来开始切换所有的View,切换会循环进行
  • stopFlipping():停止View切换

三、实例Demo 

1、静态导入,使用ViewFlipper实现图片轮播

实现效果:

实现代码:

首先添加四个子布局,每个布局都添加ImageView控件,不贴了吧!

动画anim实现向左翻转:

right_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="2000"
        android:fromXDelta="100%p"
        android:toXDelta="0"
        />
</set>

right_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="2000"
        android:fromXDelta="0"
        android:toXDelta="-100%p"/>
</set>

View层主布局activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    tools:context=".MainActivity">

    <ViewFlipper
        android:id="@+id/view_flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inAnimation="@anim/right_in"
        android:outAnimation="@anim/right_out"
        android:flipInterval="3000"><!--每隔3秒切换一个view-->
        <include layout="@layout/page1"/>
        <include layout="@layout/page2"/>
        <include layout="@layout/page3"/>
        <include layout="@layout/page"/>
    </ViewFlipper>

</LinearLayout>

Control层MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private ViewFlipper viewFlipper;//翻转视图类
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewFlipper=findViewById(R.id.view_flipper);
        viewFlipper.startFlipping();//开启viewFlipper
    }
}

2、动态导入,支持手势滑动的ViewFlipper

实现效果图:

实现代码:应为可以左右滑动,因此需要添加两个向右的动画。

left_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <translate
       android:fromXDelta="-100%p"
       android:toXDelta="0"
       android:duration="500"/>
</set>

left_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <translate
       android:toXDelta="100%p"
       android:fromXDelta="0"
       android:duration="500"/>
</set>

Control层 DynamicViewFlipperActivity.java:

public class DynamicViewFlipperActivity extends AppCompatActivity {

    private ViewFlipper viewFlipper;
    private int[] resId={R.mipmap.nature,R.mipmap.sun,R.mipmap.waterfall,R.mipmap.flowers};
    private final static  int MIN_MOVE=200;//最小距离
    private GestureDetector mDetector;//识别一些基本的触摸手势
    private MyGestureListener myGestureListener;//触摸手势监听
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamic_view_flipper);
        init();
    }
    private void init(){
        viewFlipper=findViewById(R.id.viewFlipper);
        myGestureListener=new MyGestureListener();
        mDetector=new GestureDetector(this,myGestureListener);
        for (int i=0;i<resId.length;i++){
            viewFlipper.addView(getImageView(resId[i]));
        }
    }
    //重写onTouchEvent触发MyGestureListener里的方法
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mDetector.onTouchEvent(event);
    }
    //获取图片
    private ImageView getImageView(int resId){
        ImageView image=new ImageView(this);
        image.setImageResource(resId);
        return image;
    }
    //自定义一个GestureListener,这个是View类下的
    private class MyGestureListener extends GestureDetector.SimpleOnGestureListener{
        //onFling():鼠标手势相当于一个向量(当然有可能手势是曲线),e1为向量的起点,e2为向量的终点,
        // velocityX为向量水平方向的速度,velocityY为向量垂直方向的速度
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if(e1.getX()-e2.getX()>MIN_MOVE){
                viewFlipper.setInAnimation(DynamicViewFlipperActivity.this,R.anim.right_in);
                viewFlipper.setOutAnimation(DynamicViewFlipperActivity.this,R.anim.right_out);
                viewFlipper.showNext();
            }else if (e2.getX()-e1.getX()>MIN_MOVE){
                viewFlipper.setInAnimation(DynamicViewFlipperActivity.this,R.anim.left_in);
                viewFlipper.setOutAnimation(DynamicViewFlipperActivity.this,R.anim.left_out);
                viewFlipper.showPrevious();
            }
            return true;
        }
    }
}

问题:图片不能全屏显示

解决办法:让类继承Activity,而不是AppCompatActivity(v7包下);在Android配置文件application中添加Android自带主题:

android:theme="@android:style/Theme.NoTitleBar"

猜你喜欢

转载自blog.csdn.net/dpl12/article/details/83149482