ViewFlipper实现View轮播点击等效果
来源:互联网 发布:centos python3 编辑:程序博客网 时间:2024/04/30 13:27
public class MagicViewFlipperLayout extends RelativeLayout implements View.OnTouchListener,Animation.AnimationListener { private int[] imgRes; private Context mcontext; private ViewFlipper mviewflipper; private List<listenerFunction> listlistener = new ArrayList<>(); private GestureDetector gestureDetector = null; private static final int FLING_MIN_DISTANCE = 80; private static final int FLING_MIN_VELOCITY = 150; private LinearLayout layout; private Animation animin,animaout,animaleftin,animaleftout; private boolean autoflipping; public MagicViewFlipperLayout(Context context) { super(context); initView(context); } public MagicViewFlipperLayout(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public MagicViewFlipperLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { this.mcontext = context; animin = AnimationUtils.loadAnimation(mcontext, R.anim.img_in); animaout = AnimationUtils.loadAnimation(mcontext, R.anim.img_out); animaleftin = AnimationUtils.loadAnimation(mcontext, R.anim.img_in_left); animaleftout = AnimationUtils.loadAnimation(mcontext, R.anim.img_out_left); } @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } @Override public void onAnimationStart(Animation animation) { selectedPoint(); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } public interface listenerFunction { void listf(); } /* * imgs:要放入的图片 * autoflipping:是否自动滚动 * flipinterval:滚动间隔时间 * listlistener:对应imgs的点击事件 * spotWidth:spot的宽度 * spotHeight:spot的高度 * paddingSize:spot间的间隔*/ public void startViewFlipper(int[] imgs,boolean autoflipping, int flipinterval, List<listenerFunction> listlistener,int spotWidth,int spotHeigt,int paddingSize) { this.listlistener = listlistener; this.imgRes = imgs; this.autoflipping = autoflipping; mviewflipper = new ViewFlipper(mcontext); if (listlistener.size() != imgRes.length) throw new UnsupportedOperationException("The number of listlistener is not equal the number of imgs"); for (int i = 0; i < imgRes.length; i++) { ImageView img = new ImageView(mcontext); img.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); img.setBackgroundResource(imgRes[i]); img.setScaleType(ImageView.ScaleType.CENTER); img.setTag(i); mviewflipper.addView(img); } mviewflipper.setInAnimation(animin); mviewflipper.setOutAnimation(animaout); // 开启自动启动并设置时间间隔 setViewFlipperToFlipping(autoflipping, true); mviewflipper.setFlipInterval(flipinterval); gestureDetector = new GestureDetector(mcontext, new GerstureListener()); animin.setAnimationListener(this); addView(mviewflipper); layout = new LinearLayout(mcontext); RelativeLayout.LayoutParams ll = new RelativeLayout.LayoutParams(spotWidth,spotHeigt); RelativeLayout.LayoutParams rlayout = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlayout.addRule(CENTER_HORIZONTAL); rlayout.addRule(ALIGN_PARENT_BOTTOM); ll.setMargins(0, 0, paddingSize, 20); layout.setLayoutParams(rlayout); for(int i = 0 ; i < imgRes.length ; i ++){ ImageView img = new ImageView(mcontext); img.setLayoutParams(ll); img.setImageResource(R.drawable.viewpager_spot); if(i == 0)img.setSelected(true); layout.addView(img); } addView(layout); setLongClickable(true); setOnTouchListener(this); mviewflipper.getInAnimation().setAnimationListener(this); } public void setViewFlipperToFlipping(boolean flipping,boolean startOrstop){ if(mviewflipper == null)return; if(flipping){ if(startOrstop){ mviewflipper.startFlipping(); }else{ mviewflipper.stopFlipping(); } } } private class GerstureListener implements GestureDetector.OnGestureListener { public boolean onDown(MotionEvent e) { return false; } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { setViewFlipperToFlipping(autoflipping, false); if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { // 左滑时,按照规定动画切换 mviewflipper.setInAnimation(animin); mviewflipper.setOutAnimation(animaout); mviewflipper.showNext(); } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { // 右滑时,按照规定动画切换 mviewflipper.setInAnimation(animaleftin); mviewflipper.setOutAnimation(animaleftout); mviewflipper.showPrevious(); selectedPoint(); } setViewFlipperToFlipping(autoflipping,true); // 滑动动作完毕后,设置回右进左出的动画 mviewflipper.setInAnimation(animin); mviewflipper.setOutAnimation(animaout); return true; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub listlistener.get((int)mviewflipper.getCurrentView().getTag()).listf(); return true; } } private void selectedPoint(){ int i = (int)mviewflipper.getCurrentView().getTag(); for(int j = 0 ; j < layout.getChildCount();j++){ Log.i("ls", "i = " + i + " j = " + j); if(i == j){ layout.getChildAt(j).setSelected(true); }else{ layout.getChildAt(j).setSelected(false); } } }
动画example:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%" android:toXDelta="0" android:duration="300"></translate></set>
实现:
List<MagicViewFlipperLayout.listenerFunction> listlistener = new ArrayList<>(); for(int i = 0; i < imgRes.length ; i ++){ final int finalI = i; MagicViewFlipperLayout.listenerFunction mlistener = new MagicViewFlipperLayout.listenerFunction() { @Override public void listf() { Toast.makeText(getActivity(), "" + imgRes[finalI], Toast.LENGTH_SHORT).show(); } }; listlistener.add(mlistener); } mViewPager.startViewFlipper(imgRes, true, 2000, listlistener, 28, 28,20);
0 0
- ViewFlipper实现View轮播点击等效果
- ViewFlipper实现垂直轮播广告效果
- ViewFlipper实现垂直轮播广告效果
- 点击轮播图片左右按钮,实现轮播效果
- 使用ViewFlipper实现图片轮播
- android ViewFlipper实现图片轮播
- ViewFlipper实现图片的轮播
- 使用ViewFlipper实现图片的轮播
- 安卓轮播图无限轮播(RecyclerView+ViewFlipper实现)
- Android自定义View实现文本轮播效果
- 自定义view无线轮播点击跳转
- 轮播切换效果+点击放大图
- Android自定义View实现自动无限轮播,点击图片进入详情页
- UIScrollView实现轮播效果
- 轮播广告效果实现
- js实现轮播效果
- jQuery实现轮播效果
- banner实现轮播效果
- 第十六周阅读程序1
- 解决使用SDWebImage加载图片,图片为空的问题
- 在IBM Bluemix使用Docker Container制作的MobileFirst Platform Server
- C# 异常类型
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
- ViewFlipper实现View轮播点击等效果
- scrollView和ListView的冲突,无法计算高度
- 使用gdb调试程序完全教程
- Spark运行架构
- 如何解决PHP里大量数据循环时内存耗尽的问题
- Eclipse C/CPP 调试教程
- IOS Dev Intro - UILabel
- 基于C++的大整数运算操作
- 完善dorado项目时一个奇葩的需求, 按照内容大小自动调整模块大小