自定义滑动item

来源:互联网 发布:电子琴入门教程软件 编辑:程序博客网 时间:2024/05/16 14:55

滑动item最重要的是对Scroller的使用,关于Scroller介绍http://blog.csdn.net/linghu_java/article/details/9087841,关于Scroller的滑动原理,请看这里http://blog.csdn.net/xiaanming/article/details/17483273,整个工作流程图(来自xiaanming)

Scroller 相关API:

1 mScroller.getCurrX() //获取mScroller当前水平滚动的位置

2 mScroller.getCurrY() //获取mScroller当前竖直滚动的位置

3 mScroller.getFinalX() //获取mScroller最终停止的水平位置

4 mScroller.getFinalY() //获取mScroller最终停止的竖直位置

5 mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置

6 mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置

7 //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间

8 mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms

9 mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)

10 mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。

效果图:

import com.example.mytoolutils.R;import com.example.mytoolutils.utils.DensityUtil;import com.example.mytoolutils.utils.LogUtils;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Scroller;import android.widget.TextView;public class SlideView extends LinearLayout implements android.view.View.OnClickListener {    private int lastX;    private int lastY;    /** view移动距离*/    private int slidex;    /** 隐藏view的宽度*/    private Scroller scroller;    private int hideWidth=240;    private Context context;    private LinearLayout content,holder;    private TextView deletetext,toptext;    private SlideClick slideClick;    public SlideView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }    public SlideView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public SlideView(Context context) {        super(context);        init();    }    private void init() {        context=getContext();        scroller=new Scroller(context);        setOrientation(LinearLayout.HORIZONTAL);        initview();        //dp转换成px        hideWidth=DensityUtil.dip2px(context, hideWidth);    }    private void initview(){        View.inflate(context, R.layout.activity_slide_view_merge,this);        content=(LinearLayout) findViewById(R.id.view_content);        holder=(LinearLayout) findViewById(R.id.holder);        deletetext=(TextView) findViewById(R.id.delete);        toptext=(TextView) findViewById(R.id.top);        deletetext.setOnClickListener(this);        toptext.setOnClickListener(this);    }    /**     * 还原     */    public void restore(){        if(scroller!=null){            smoothScrollTo(0,0);        }    }    /**     * 添加监听器     * @param slideClick     */    public void setonClick(SlideClick slideClick){        this.slideClick=slideClick;    }    /**     * 添加view     * @param view     */    public void SetView(View view){        content.addView(view);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        slidex=0;        //触摸点        int x=(int) event.getX();        int y=(int) event.getY();        //滑动点        int scrollX=getScrollX();        LogUtils.i("滑动:"+scrollX);        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            //结束滑动动画            if(!scroller.isFinished()){                scroller.abortAnimation();            }            break;        case MotionEvent.ACTION_MOVE:            //当前手指移动距离            int deletex=x-lastX;            int deletey=y-lastY;            //x方向的滑动距离大于y方向的滑动距离,即开始滑动显示隐藏部分            if(Math.abs(deletex)<Math.abs(deletey))                break;            //距离 边缘距离-手指移动部分=实际view需要移动的距离            slidex= scrollX-deletex;            if(deletex==0)                break;            if(slidex<0){//当前设定为向左边滑动(scrollTo(-100,20)表示向x正方向移动100,向y负方向移动20)                slidex=0;            }else if(slidex>hideWidth){                slidex=hideWidth;            }            //滑动            scrollTo(slidex, 0);            break;        case MotionEvent.ACTION_UP:            //滑动距离大于隐藏部分的0.75就显示出来  否则隐藏            if(scrollX>hideWidth*.75){                slidex=hideWidth;            }            smoothScrollTo(slidex,0);            break;        default:            break;        }        lastX=x;        lastY=y;        return true;    }    /**     * 平滑过渡     * @param x     * @param y     */    private void smoothScrollTo(int x, int y) {        //调用startScroll()是不会有滚动效果的,只有在computeScroll()获取滚动情况,做出滚动的响应        scroller.startScroll(getScrollX(), 0,x-getScrollX(),0, 2000);        invalidate();    }    @Override    public void computeScroll() {        //当滑动动画还没结束        if(scroller.computeScrollOffset()){            scrollTo(scroller.getCurrX(),scroller.getCurrY());            postInvalidate();        }    }    @Override    public void onClick(View v) {        if(slideClick==null)            return;        switch (v.getId()) {        case R.id.delete:            slideClick.DeleteClick(0,"删除");            break;        case R.id.top:            slideClick.TopClick(1,"置顶");            break;        default:            break;        }    }    interface SlideClick{        /**         * 删除监听         */        void DeleteClick(int position,String hint);        /**         * 置顶监听         */        void TopClick(int position,String hint);    }}

R.layout.activity_slide_view_merge:

<?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <LinearLayout        android:id="@+id/view_content"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="horizontal" >    </LinearLayout>    <LinearLayout        android:id="@+id/holder"        android:layout_width="240dp"        android:layout_height="match_parent"        android:gravity="center"        android:orientation="horizontal" >        <TextView            android:id="@+id/delete"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="match_parent"            android:background="@color/red"            android:drawableLeft="@drawable/delete_icon_normal"            android:gravity="center"            android:text="删除"            android:textColor="@color/floralwhite" />        <TextView            android:id="@+id/top"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="match_parent"            android:background="@color/aqua"            android:drawableLeft="@drawable/ic_launcher"            android:gravity="center"            android:text="置顶"            android:textColor="@color/floralwhite" />    </LinearLayout></merge>

Activity:

import com.example.mytoolutils.R;import com.example.mytoolutils.slide.SlideView.SlideClick;import com.example.mytoolutils.utils.ToastUtil;import android.app.Activity;import android.os.Bundle;import android.view.Gravity;import android.view.MotionEvent;import android.view.ViewGroup.LayoutParams;import android.widget.TextView;public class SlideActivity extends Activity implements SlideClick{    private SlideView leftSlideView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_right_slide);        TextView textView=new TextView(this);        textView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));        textView.setGravity(Gravity.CENTER);        textView.setText("leftSlideView");        leftSlideView=(SlideView)findViewById(R.id.leftSlideView);        leftSlideView.SetView(textView);        leftSlideView.setonClick(this);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        //还原        leftSlideView.restore();        return super.onTouchEvent(event);    }    @Override    public void DeleteClick(int position, String hint) {        ToastUtil.show(this, hint, 0);    }    @Override    public void TopClick(int position, String hint) {        ToastUtil.show(this, hint, 0);    }}
0 0
原创粉丝点击