安卓,可侧滑的linearlayout,可用于recylcerview等集合控件,
来源:互联网 发布:js设置fontsize 编辑:程序博客网 时间:2024/05/19 12:40
基本思路,重写linearlayout ontouch等,处理事件冲突
看效果
源码如下:
package cf.midea.fridgeterminal.ui;import android.animation.Animator;import android.animation.ValueAnimator;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.animation.BounceInterpolator;import android.widget.LinearLayout;/** * Created by cf on 16/7/16. */public class ScrollableLinearLayout extends LinearLayout { public ScrollableLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); this.setClickable(true); valueAnimator=ValueAnimator.ofFloat(0,1); } private int down_x; private int move_x; private int diff_x; @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: down_x = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: move_x = (int) event.getX(); if(move_x!=down_x) return true; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: break; } return false; } private int scroll_total; private ValueAnimator valueAnimator; @Override public boolean onTouchEvent(MotionEvent event) { if(scroll_total>0) this.getParent().requestDisallowInterceptTouchEvent(true); int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: move_x = (int) event.getX(); diff_x = (down_x - move_x) ; if(diff_x!=0) this.getParent().requestDisallowInterceptTouchEvent(true); down_x = move_x; if ((scroll_total + diff_x) > width_right) { this.scrollBy(width_right - scroll_total, 0); scroll_total = width_right; } else if (scroll_total + diff_x < 0) { this.scrollBy(0 - scroll_total, 0); scroll_total = 0; } else { this.scrollBy(diff_x, 0); scroll_total += diff_x; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: final int dis=scroll_total>width_right/2?width_right-scroll_total:0-scroll_total; valueAnimator.setInterpolator(new BounceInterpolator()); valueAnimator.setDuration(300).start(); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { float cur= (float) valueAnimator.getAnimatedValue(); ScrollableLinearLayout.this.scrollTo(scroll_total+(int)(cur*dis),0); } }); valueAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { scroll_total=scroll_total>width_right/2?width_right:0; } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); break; } return super.onTouchEvent(event); } private int width_right; @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); width_right = getChildAt(1).getWidth(); }}
0 0
- 安卓,可侧滑的linearlayout,可用于recylcerview等集合控件,
- 安卓linearLayout动态添加控件
- 安卓 LinearLayout的用法
- 安卓控件集合
- recylcerview的属性
- RecylcerView的autofit实现
- 安卓学习之控件布局LinearLayout示例
- 返回一个可用于循环访问集合的枚举数
- 安卓LinearLayout布局
- jquery-ui fullCalendar 可用于设计日程管理的控件
- jquery-ui fullCalendar可用于设计日程管理的控件
- 安卓学习第十六天:控件布局与LinearLayout的用法,内边距与外边距,单位的概念
- 安卓 新版本 获取wifi状态网络是否可用等
- Android GridView等控件的属性集合
- 安卓的LinearLayout实现按钮的点击效果
- 安卓LinearLayout布局问题
- Android 打造顶部停留控件,可用于所有可滚动的控件(ScrollView,ListView)
- 安卓的复制于粘贴剪切
- Emgu Capture类 分析
- Longest Increasing Subsequence -- Leetcode
- 杭电ACM 1089-1096
- ubuntu server 搭建apache + php7 + mysql + swoole框架环境
- 【dp】排队
- 安卓,可侧滑的linearlayout,可用于recylcerview等集合控件,
- xcode 打包 framework 简易教程
- 多例模式
- u-boot2013.01 smdk2410 启动第二阶段分析
- php数据类型以及判断isset或者empty使用
- C++动态类型转换、强制类型转换、静态类型转换举例分析
- 2016/07/16 《jquery仿新浪微博新版搜索下拉特效》学习笔记一
- int 负数最小值
- 随机数发生器