安卓,可侧滑的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
原创粉丝点击