自定义滑动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); }}
- 自定义滑动item
- 自定义滑动删除item的ListView。
- 自定义GridView,实现item之间相互滑动
- 自定义组合控件之滑动item+删除
- 自定义RecyclerView 支持 横向纵向,滑动删除Item
- Android开发--自定义控件实现listview的滑动删除item
- 自定义可左滑动删除item的listview
- list滑动删除item
- listview item 左右滑动
- 横向滑动item
- ListView Item左右滑动
- 自定义ListView实现仿QQ消息列表滑动item出现删除按钮
- 自定义ListView控件在滑动的过程中动态提示item(四)
- android 滑动显示item首字母
- Android ListView item 水平滑动
- Gallery每次滑动一个item
- 仿微信ListView item左右滑动
- 滑动删除ListView的Item
- LASlib在VS2015 x64平台下的编译
- java技术论文
- 机器学习算法原理与实践(二)、meanshift算法图解以及在图像聚类、目标跟踪中的应用
- HTML5:视频控制
- ubuntu 安装JDK
- 自定义滑动item
- 这些东西,写给当年眼瞎的自己,再见
- C#中partial的解释
- 《塔防类手游开发教程》 第七节 炮塔发射子弹
- js中常用的一些事件总结
- 提交表单,有两个页面,一个是系统日志,一个是运行日志,其中日志类型不能用同一个"name",否则其中一个会出现404页面,可能是缓存问题吧(API?)
- RPC 框架
- 高通8909模块之SPI特性
- 工作问题-java-三层数据结构