猎影-----Scroller的基本使用
相信用过自定义滑动控件的同志们对 Scroller不陌生,那Scroller到底是什么,带着疑问,我哭着来了
1. Scroller 是什么?
在讲到 view的位置改变方式 篇中,有用到 scrollBy(x, y); scrollTo(x, y);这两个方法是 View 自带的 滑动 公开方法,这两个方法实现的移动方式是“变”,使的控件的移动很突兀,不美观,与我们希望的平滑的移动相去甚远,为了实现平滑的移动,于是 Scroller 出生了
2. Scroller 有哪些基本用法
mScroller.getCurrX();//获取当前触点的 X 坐标
mScroller.getCurrY();//获取当前触点的 Y 坐标
mScroller.computeScrollOffset();//判断当前是否在
mScroller.startScroll(startX, startY, dx, dy);//移动方法,startX, startY是view当前坐标,dx, dy为偏移量
mScroller.startScroll(startX, startY, dx, dy, duration);//前四个参数就补介绍了,最后一个是移动耗时
3. Scroller 的使用
主要分三步:
1.初始化 Scroller
2.重写自定义view类中的 computeScroll 方法
3. Scroller 模拟移动 mScroller.startScroll(startX, startY, dx, dy);
还是以 《 view的位置改变方式》篇中的随手指移动的view为例,下面分步解说
首先,当然是得自定义view了:
@SuppressLint("ClickableViewAccessibility")
public class DragView extends View {private Context mContext;private int mLastX;private int mLastY;private int mOfferX;private int mOfferY;private Scroller mScroller;public DragView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext=context;initData();}
好,然后来看 initData 方法中是怎么初始化 Scroller 的
private void initData(){mScroller=new Scroller(mContext);}
看view的重写方法 computeScroll
@Overridepublic void computeScroll(){super.computeScroll();//Scroller提供computeScrollOffset方法判断是否完成滚动,滚动的时候computeScrollOffset返回trueif(mScroller.computeScrollOffset()){((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//通过重绘不断调用computeScrollinvalidate();}}
此处要注意的几点:
1.computeScrollOffset 对于滚动的判断
2. scrollTo 方法的调用者为 (View)getParent(),而非view ,scrollTo(x,y)中的参数为当前坐标,这点要和scrollBy(dx,dy)区分开
3. 调用完毕后,记得重绘 invalidate();
好的,现在准备就绪,就看 touch事件的处理了
@Overridepublic boolean onTouchEvent(MotionEvent event) {int currentX = (int) event.getX();int currentY = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX=currentX;mLastY=currentY;break;case MotionEvent.ACTION_MOVE:mOfferX=currentX-mLastX;mOfferY=currentY-mLastY;//当前layout上面添加偏移量mScroller.startScroll(mScroller.getCurrX(), mScroller.getCurrY(), -20, 0);invalidate();break;case MotionEvent.ACTION_UP://重新设置坐标mLastX=currentX;mLastY=currentY;break;default:break;}return true;}
主要还是看Action—move中的处理,先是 startScroll(x,y,dx,dy),然后重绘
Ok,搞定,现在把整个代码贴出来
package com.example.androidtexta;import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;/**** 移动控件三步骤:* 1.在 MotionEvent.ACTION_DOWN 中记录摁下的坐标* 2.在 ACTION_MOVE 后算出 坐标移动差值,重新设置view的位置* 3.更新最后的xy坐标记录**/
@SuppressLint("ClickableViewAccessibility")
public class DragView extends View {private Context mContext;private int mLastX;private int mLastY;private int mOfferX;private int mOfferY;private Scroller mScroller;public DragView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext=context;initData();}private void initData(){mScroller=new Scroller(mContext);}@Overridepublic boolean onTouchEvent(MotionEvent event) {int currentX = (int) event.getX();int currentY = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX=currentX;mLastY=currentY;break;case MotionEvent.ACTION_MOVE:mOfferX=currentX-mLastX;mOfferY=currentY-mLastY;//当前layout上面添加偏移量mScroller.startScroll(mScroller.getCurrX(), mScroller.getCurrY(), -20, 0);invalidate();break;case MotionEvent.ACTION_UP://重新设置坐标mLastX=currentX;mLastY=currentY;break;default:break;}return true;}@Overridepublic void computeScroll(){super.computeScroll();//Scroller提供computeScrollOffset方法判断是否完成滚动,滚动的时候computeScrollOffset返回trueif(mScroller.computeScrollOffset()){((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//通过重绘不断调用computeScrollinvalidate();}}}
好,搞定
猎影-----Scroller的基本使用相关推荐
- 代码解说Android Scroller、VelocityTracker
在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简单介绍(二):实例具体解释onInterceptTouchE ...
- flex Scroller
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- Android Scroller与computeScroll方法的调用关系
2019独角兽企业重金招聘Python工程师标准>>> Android ViewGroup中的Scroller与computeScroll的有什么关系? 答:没有直接的关系 知道了答 ...
- 通过Scroller.js制作上拉加载和下拉刷新
为什么80%的码农都做不了架构师?>>> 之前做移动端webAPP开发,一直是用的IScroll来做滚动列表,但是IScroll没有直接提供上下拉刷新的功能,虽然我们基于ISc ...
- Android Scroller简单用法
Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(conte ...
- Egret之eui.Scroller
(纯码农制作 ,不喜勿喷)先看看结果 : 一 : Cell(render) Skin 的制作: 看结果是横向的滚动 , 向左 . 如果第一次显示第二个cell , 那么需向左滑动Cell的宽度 + C ...
- Android自己定义组件系列【2】——Scroller类
在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友能够先看<自己定义View及ViewGroup> scrollTo和scrollBy尽管实 ...
- Android Scroller 使用详解
1.Scroller到底是什么? 答:Scroller只是个计算器,提供插值计算,让滚动过程具有动画属性,但它并不是View,只是单纯地为滑动提供计算. 2.Scroller只是提供计算,那谁来让Vi ...
- 使用Scroller实现弹性滑动
scrollTo.scrollBy View内部为了实现滑动提供了这两个方法,但是使用这两个方法滑动的效果是瞬间的不够平滑,如何实现View的弹性滑动呢?这正是本博文讨论的主题.另外这两个函数滑动的是 ...
最新文章
- 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
- drools规则中调用其它规则_简化机器学习中的关联规则
- gnome mysql client_configure: error: Not found mysqlclient library
- ansible-playbook jdk安装
- Handlebars.js 模板引擎
- 2B.处女座与cf(C++)
- HTML/CSS/动画
- 牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)
- fpga中wire和reg的区别
- 不管什么事,只要用心做,总不会太差!
- mysql 表上限_mysql 数据库表的上限
- Fancybox丰富的弹出层效果
- 导航守卫与keep-alive
- java官方网站下载_java下载 7.0 官方版
- 通用mrp手机必备新手安装包
- win10电脑状态栏图标不见消失解决办法
- 名字中间一条线怎么弄_怎么在网名中间画一条横线 一条横线穿过字的网名
- 《机器学习实战》学习笔记(八):预测数值型数据 - 回归
- 2004年高考数学压轴题(利用对数齐次化或主元法解决)
- 转变思维,寒冬中的一把“创业火” ——猿团CEO受邀做主题演讲
热门文章
- 设置添加环境变量Path
- Java设计模式 - 管道模式
- 2007年微型计算机内容,2007年10月自考试题微型计算机及接口技术全国试卷
- Android锁屏系统重启
- php正则表达式替换,php正则表达式如何替换字符
- 某人去玩具店买小熊,小熊进价为20,卖价是30,付给老板100元,老板没有零钱,就在卖鞋的人那里换了100元零钱,找给卖家70,卖鞋的发现那100元是假币,于是找老板换回了100元,请问玩具店老板损失
- 实习闲余——对Pinia的整理和学习
- 从事互联网金融行业需具备哪些常识?
- 挣1万,可能靠的是体力。挣10万,也许靠的是脑力。挣100万靠什么?
- 计算机专业如何做技能作品,浅谈一堂计算机技能课教学