Android-ViewFlipper的滑动与子视图中item点击的冲突解决
来源:互联网 发布:redis与mysql的区别 编辑:程序博客网 时间:2024/05/22 01:49
场景:ViewFlipper中添加了几个View,每个View中有几条itemView,每个itemView设置了setOnClickListener,ViewFlipper中通过GestureDetector来控制左右翻页效果。
问题:不滑动,点击每个itemView,运行正常,当触发了滑动后,手势抬起时,依然会执行itemView的click事件
解决:在继承的ViewFlipper中,拦截手势动作onInterceptTouchEvent来拦截MotionEvent.ACTION_UP动作,如果正在处理滑动,直接返回true,不再下发,放置触发itemView的点击事件,下面给出ViewFlipper的代码,里面有注释
package com.custom.views.carousel;import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.TranslateAnimation;import android.widget.ViewFlipper;import java.util.ArrayList;import java.util.List;/** * Created by menghui on 2017/10/23. */public class JRJCarouselFlipper extends ViewFlipper { /** * 视图切换监听 */ public interface CarouselChanged{ void onChanged(int oldIndex,int newIndex,View view); } private Animation rightInAnim,leftOutAnim,rightOutAnim,leftInAnim; private List<View> views; private CarouselChanged carouselChanged; //动画周期 private int duration = 500; private GestureDetector gestureDetector; private GestureDetector.OnGestureListener gestureListener; //是否滑动中,该标志用来避免gesture的滑动和滑动View中item的点击冲突 private boolean fling = false; public JRJCarouselFlipper(Context context) { super(context); init(context); } public JRJCarouselFlipper(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context ctx){ gestureListener = new GestureDetector.OnGestureListener() { @Override public boolean onDown(MotionEvent e) { fling = false; return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { fling = true; if (e1.getX() - e2.getX() > 100) { setInAnimation(rightInAnim); setOutAnimation(leftOutAnim); int old = getDisplayedChild(); showNext(); int newindex = getDisplayedChild(); triggerChanged(old,newindex); return true; } else if (e1.getX() - e2.getX() < -100) { setInAnimation(leftInAnim); setOutAnimation(rightOutAnim); int old = getDisplayedChild(); showPrevious(); int newindex = getDisplayedChild(); triggerChanged(old,newindex); return true; } return false; } }; gestureDetector = new GestureDetector(gestureListener); views = new ArrayList<>(); // 图片从右侧滑入 rightInAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); rightInAnim.setDuration(duration); // 图片从左侧滑出 leftOutAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); leftOutAnim.setDuration(duration); // 图片从右侧滑出 rightOutAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); rightOutAnim.setDuration(duration); // 图片从左侧滑入 leftInAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); leftInAnim.setDuration(duration); } private void triggerChanged(int oldIndex,int newIndex){ if (views.size() <= 0) return; if (carouselChanged != null){ carouselChanged.onChanged(oldIndex,newIndex,views.get(newIndex)); } } public CarouselChanged getCarouselChanged() { return carouselChanged; } public void setCarouselChanged(CarouselChanged carouselChanged) { this.carouselChanged = carouselChanged; } /** * 设置要轮播的视图列表 * @param views */ public void setViews(List<View> views) { this.views.clear(); this.removeAllViews(); this.views.addAll(views); for(View v:views){ this.addView(v); } } /** * 拦截触屏,当按下时,fling=false,允许点击子视图中的item,当手势抬起时,为避免和滑动发生冲突,判断fling状态, * 如果处于滑动中,并且是手势抬起,返回true,不再向下传递,使item点击事件失效 * @param ev * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) fling = false; else if (fling && ev.getAction() == MotionEvent.ACTION_UP){ return true; } return super.onInterceptTouchEvent(ev); } /** * 分发触屏,交给gesture * @param ev * @return */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { gestureDetector.onTouchEvent(ev); return super.dispatchTouchEvent(ev); }}
阅读全文
0 0
- Android-ViewFlipper的滑动与子视图中item点击的冲突解决
- 解决ListView中Item的子控件与Item点击事件冲突
- 解决ListView中Item的子控件(比如Button)与Item点击事件冲突
- 解决ListView中Item的子控件与Item点击事件冲突
- Android中解决listview的item点击事件和子控件点击事件的冲突
- Gallery滑动与Item中Layout点击冲突解决
- ListView滑动item时响应滑动的条件及解决与点击事件的冲突
- ListView 与 它里面的Item 点击滑动冲突
- listview或gridview中item的点击事件与控件点击事件冲突的解决
- ListView中Item的子控件与Item点击事件冲的解决方式
- item子view的点击事件与item本身的点击事件冲突
- 解决链接ClickableSpan中点击后与ListView中item的长按冲突的问题
- android完美解决ClickableSpan中点击后ListView中item的长按冲突的问题
- 解决viewflipper 与scrollview的手势冲突
- Android ListView上下滑动与item左右滑动冲突解决
- Android:ListView的点击事件与子控件点击冲突的解决
- ViewPager与Item滑动冲突的bug
- 解决android子控件与父控件滑动冲突的问题
- 手机验证码平台,怎么发送手机验证码,php开发手机验证码短信接口功能
- 加酒店logo--改app图片
- 铁血军魂:所有的痛苦,都是CBK精英成长蜕变的肥料
- Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)
- HDU
- Android-ViewFlipper的滑动与子视图中item点击的冲突解决
- 随机排序算法
- 从零开始学Python学习笔记---之--pandas序列部分
- Linux中常用操作命令
- myeclipse8.6注册代码
- switch语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
- 内存分配之堆和栈的区别
- SpringBoot开荒之路
- 网络安全靠法制,网络信息内容管理又增两细则