Android View移动的六种方法小结
在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。
layout()
如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果。
public class dragview extends view{ private int lastx; private int lasty; public dragview(context context, attributeset attrs) { super(context, attrs); } public boolean ontouchevent(motionevent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getx(); int y = (int) event.gety(); switch(event.getaction()){ case motionevent.action_down: lastx = x; lasty = y; break; case motionevent.action_move: //计算移动的距离 int offx = x - lastx; int offy = y - lasty; //调用layout方法来重新放置它的位置 layout(getleft()+offx, gettop()+offy, getright()+offx , getbottom()+offy); break; } return true; } }
offsetleftandright() offsettopandbottom()
其实这两个方法分别是对左右移动和上下移动的封装,传入的就是偏移量。
public boolean ontouchevent(motionevent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getx(); int y = (int) event.gety(); switch(event.getaction()){ case motionevent.action_down: lastx = x; lasty = y; break; case motionevent.action_move: //计算移动的距离 int offx = x - lastx; int offy = y - lasty; offsetleftandright(offx); offsettopandbottom(offy); break; } return true; }
layoutparams
public boolean ontouchevent(motionevent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getx(); int y = (int) event.gety(); switch(event.getaction()){ case motionevent.action_down: lastx = x; lasty = y; break; case motionevent.action_move: //计算移动的距离 int offx = x - lastx; int offy = y - lasty; viewgroup.marginlayoutparams mlp = (marginlayoutparams) getlayoutparams(); mlp.leftmargin = getleft()+offx; mlp.topmargin = gettop()+offy; setlayoutparams(mlp); break; } return true; }
scrollto() scrollby()
sceollto(x,y)传入的应该是移动的终点坐标
scrollby(dx,dy)传入的是移动的增量。
通过scrollby传入的值应该是你需要的那个增量的相反数!
public boolean ontouchevent(motionevent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getx(); int y = (int) event.gety(); switch(event.getaction()){ case motionevent.action_down: lastx = x; lasty = y; break; case motionevent.action_move: //计算移动的距离 int offx = x - lastx; int offy = y - lasty; ((view) getparent()).scrollby(-offx,- offy); break; } return true; }
scroller
步骤一:
初始化scroller对象,即mscroller = new scroller(context)
步骤二:
重写computescroll()方法,实现模拟滑动。可以复制下面的末模板代码:
public void computescroll() { super.computescroll(); if(mscroller.computescrolloffset()){ ((view)getparent()).scrollto(mscroller.getcurrx(),mscroller.getcurry()); } invalidate();//必须要调用 }
步骤三:
开启模拟过程,在合适的地方(一般都在move中)startscroll方法。它有两个重载方法如下:
startscroll(int startx,int starty, int dx,int dy,int duration) startscroll(int startx,int starty,int dx,int dy)
需要说明的是:
1.computescrolloffset方法用来判断是否完成了整个滑动,返回为true,则说明没有完成,否则则完成滑动。
2.getcurry()以及getcurrx()获得的是当前的滑动坐标。
3.最后必须要用invalidate方法来刷新。因为computescroll方法不会自动调用,是在draw方法中被调用的。所以必须使用invalidate刷新,就会调用draw方法,自然就会调用computescroll方法了。这样子就会实现循环调用。
4.在startscroll中,偏移量跟使用scrollby方法中的偏移量用法是一样的,即也必须填写你实际想要移动距离的相反数。也就是你实际想让它偏移一个正值,这里就填写它相应的负值,如果想偏移一个负值,这里就填写相应的正值!
public class dragview extends view{ private int lastx; private int lasty; private scroller mscroller; public dragview(context context, attributeset attrs) { super(context, attrs); mscroller = new scroller(context); } public boolean ontouchevent(motionevent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getx(); int y = (int) event.gety(); switch(event.getaction()){ case motionevent.action_down: lastx = x; lasty = y; break; case motionevent.action_move: //计算移动的距离 int offx = x - lastx; int offy = y - lasty; view viewgroup = (view) getparent(); ((view) getparent()).scrollby(-offx,- offy); break; case motionevent.action_up: view viewgroup = (view) getparent(); //开启滑动,让其回到原点 mscroller.startscroll(viewgroup.getscrollx(), viewgroup.getscrolly(), -viewgroup.getscrollx() ,-viewgroup.getscrolly()); break; } return true; } public void computescroll() { super.computescroll(); if(mscroller.computescrolloffset()) { ((view)getparent()).scrollto(mscroller.getcurrx(), mscroller.getcurry()); } invalidate();//必须要调用 } }
下面给大家介绍android view类
不是对照翻译,只是理解性翻译。 本文只用于个人复习,不保证翻译的准确和正确性。
一 view 的基本概念
1. 基本描述:
这个类是用户接口的基础构件。 view 表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理。
view 是所有widget类的基类,widget 类用于创建交互式ui构件(按钮,输入框等)。
view 类的viewgroup子类是layout 的基类,layout是一个不可见的容器,它保存着view(或viewgroup)并定义这些view的layout 属性。
可以说view类是用户接口类中最重要的一个类。
2. 使用 view
2.1 view 的组织:
同一个窗口的所用view 都存储在一个树内,既可以通过代码动态增加删除view, 也可以通过在xml文件中定义一个view树来构造这个树。
2.2 . 主要操作:
2.2.1 设置属性:既通过view和其子类的方法设置view的属性, 也可以在xml文件中设置view的属性。
2.2.2 设置焦点: 通过requestfocus 方法可以强制view获得焦点。
2.2.3 设置 listener: 可以通过设置listener来监听 特定view的事件, 比如获得或失去焦点,点击事件等。
2.2.4 设置visibility: 可以隐藏或显示view, setvisibility.
2.3. 注意事项:
android framework 负责measuring laying out 和drawing view. 除非要自己实现一个viewgroup,
否则不应该显示调用实现这些功能的方法。
二 实现定制view
为了实现一个定制view, 需要重写一些view的标准方法。
framework会调用这些方法, 并且认为这些方法应该是所有的view都有实现。
这些方法不必全部重写, 事实上,可以只重写ondraw 函数就可以了
三 view的属性和动作:
1 属性:
1.1 ids: views 有一个整数相对应, id被用于在view 数中找到指定的view.
可以在layout 文件中定义 一个唯一的id, 在activity 的 oncreate函数中调用findviewbyid来查找这个view.
在整个树内, view可以不是唯一的,但再指定的范围内查找时我们可以确信它是唯一的
2.位置:
view是一个矩形区域, 使用左&上的坐标以及长和宽可以表示一个view. 我们可以使用方法getleft() gettop() getright() getbottom() getwidth() 等函数
来获取其位置信息.