本篇给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候, 用来实现进入应用后的引导页,或者用于图片轮播,本篇我们我们会使用两个例子:一个自动播放首页轮播页一个手动可左右滑动道页的轮播页来说透这个组件的使用。
我们可以看到,这是一个化妆品的轮播图。它以每隔2秒的间隔,从右到左自动一个个轮播展现首页的广告图。
通过项目结构,我们可以知道我们的轮播页有5页,每一页内含一个图片。
然后我们做了一个平滑过渡的动画:
这么一个循环。
内容都一样,只是内含的图片不一样
package org.mk.android.demoautoflipper;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.ViewFlipper;public class MainActivity extends AppCompatActivity {private ViewFlipper adFlipper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);adFlipper=(ViewFlipper)findViewById(R.id.adFlipper);adFlipper.startFlipping();}
}
非常简单。
手动滑动代替了自动轮播,因此我们支持两种手势,往左滑和往右滑。因此我人把从右到左滑设成+向,从左到向设成-向。因此我们为了支持向右、向左的手势还需要设置一组left_in.xml和left_out.xml。
前端代码只增加了left_in.xml和left_out.xml
package org.mk.android.demomanualflipper;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.ViewFlipper;public class MainActivity extends AppCompatActivity {private Context mContext;private ViewFlipper vflp_help;private int[] resId = {R.drawable.ad_pic_1, R.drawable.ad_pic_2,R.drawable.ad_pic_3, R.drawable.ad_pic_4, R.drawable.ad_pic_5};private final static int DISTANCE = 200; //最小距离private CustomerizedGestureListener cgListener;private GestureDetector gDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = MainActivity.this;//实例化SimpleOnGestureListener与GestureDetector对象cgListener = new CustomerizedGestureListener();gDetector = new GestureDetector(this, cgListener);vflp_help = (ViewFlipper) findViewById(R.id.adFlipper);//动态导入添加子Viewfor(int i = 0;i < resId.length;i++){vflp_help.addView(getImageView(resId[i]));}}//重写onTouchEvent触发MyGestureListener里的方法@Overridepublic boolean onTouchEvent(MotionEvent event) {return gDetector.onTouchEvent(event);}//自定义一个GestureListener,这个是View类下的private class CustomerizedGestureListener extends GestureDetector.SimpleOnGestureListener {@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {if(e1.getX() - e2.getX() > DISTANCE){vflp_help.setInAnimation(mContext,R.anim.right_in);vflp_help.setOutAnimation(mContext, R.anim.right_out);vflp_help.showNext();}else if(e2.getX() - e1.getX() > DISTANCE){vflp_help.setInAnimation(mContext,R.anim.left_in);vflp_help.setOutAnimation(mContext, R.anim.left_out);vflp_help.showPrevious();}return true;}}private ImageView getImageView(int resId){ImageView img = new ImageView(this);img.setBackgroundResource(resId);return img;}
}