Android绘图基础之实现View滑动的方法

原创 2016年05月30日 13:40:04

这篇文章主要讲解六种滑动的方法,分别是:layout()、offsetLeftAndRight()与offsetTopAndBottom()、LayoutParams、动画、scollTo与scollBy和Scroller。


layout()

view进行绘制的时候会调用onLayout()方法来设置显示的位置,因此我们同样也可以通过修改View的left、top、right、bottom这四种属性来控制View的坐标。首先我们要自定义一个View,在onTouchEvent()方法中获取触摸点的坐标:

   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 offsetX = x - lastX;
                int offsetY = y - lastY;
                //调用layout方法来重新放置它的位置
                layout(getLeft()+offsetX, getTop()+offsetY,
                        getRight()+offsetX , getBottom()+offsetY);
                break;
                ...

当我们每次移动时都会调用layout()方法来对自己重新布局,从而达到移动View的效果。

CustomView部分代码 :

public class CustomView extends View {
    private int lastX;
    private int lastY;
    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 offsetX = x - lastX;
                int offsetY = y - lastY;
                //调用layout方法来重新放置它的位置
                layout(getLeft()+offsetX, getTop()+offsetY,
                        getRight()+offsetX , getBottom()+offsetY);
                break;
        }
        return true;
    }
}

offsetLeftAndRight()与offsetTopAndBottom():

我们将ACTION_MOVE中的代码替换成如下代码:

            case MotionEvent.ACTION_MOVE:
                int offsetX = x - lastX;
                int offsetY = y - lastY;
                offsetLeftAndRight(offsetX);
                offsetTopAndBottom(offsetY);
                break;

LayoutParams(改变布局参数):

LayoutParams主要保存了一个View的布局参数,因此我们可以通过LayoutParams来改变View的布局的参数从而达到了改变View的位置的效果。同样的我们将ACTION_MOVE中的代码替换成如下代码:

LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams();
                layoutParams.leftMargin = getLeft() + offsetX;
                layoutParams.topMargin = getTop() + offsetY;
                setLayoutParams(layoutParams);

因为父控件是LinearLayout,所以我们用了LinearLayout.LayoutParams,如果父控件是RelativeLayout则要使用RelativeLayout.LayoutParams。除了使用布局的LayoutParams外,我们还可以用ViewGroup.MarginLayoutParams来实现:

                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
                layoutParams.leftMargin = getLeft() + offsetX;
                layoutParams.topMargin = getTop() + offsetY;
                setLayoutParams(layoutParams);

动画

可以采用View动画来移动,在res目录新建anim文件夹并创建translate.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="300" android:duration="1000"/>
</set>

在Java代码中:

  mCustomView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.translate));

本身位置没变

当然使用属性动画移动那就更简单了,我们让CustomView在1000毫秒内沿着X轴像右平移300像素:

ObjectAnimator.ofFloat(mCustomView,"translationX",0,300).setDuration(1000).start();

本身位置有变


scollTo与scollBy

 ((View)getParent()).scrollBy(-offsetX,-offsetY);

这里要实现View随着我们手指移动的效果的话,我们就需要将偏移量设置为负值。


Scroller

使用scollTo/scollBy方法来进行滑动时,这个过程是瞬间完成的,所以用户体验不大好。所以这里我们可以用Scroller来实现有过度效果的滑动。但是Scroller本身是不能实现View的滑动的,它需要配合View的computeScroll()方法才能弹性滑动的效果。

eg:在这里我们实现CustomView平滑的向右移动。

首先我们要初始化Scroller:

  public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScroller = new Scroller(context);
    }

接下来重写computeScroll()方法,系统会在绘制View的时候在draw()方法中调用该方法,这个方法中我们调用父类的scrollTo()方法并通过Scroller来不断获取当前的滚动值,每滑动一小段距离我们就调用invalidate()方法不断的进行重绘,重绘就会调用computeScroll()方法,这样我们就通过不断的移动一个小的距离并连贯起来就实现了平滑移动的效果:

    @Override
    public void computeScroll() {
        super.computeScroll();
        if(mScroller.computeScrollOffset()){
           ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
             //通过不断的重绘不断的调用computeScroll方法
             invalidate();
        }  
    }

调用Scroller.startScroll()方法。我们在CustomView中写一个smoothScrollTo()方法,调用Scroller.startScroll()方法,在2000毫秒内沿X轴平移delta像素:
public void smoothScrollTo(int destX,int destY){
int scrollX=getScrollX();
int delta=destX-scrollX;
//1000秒内滑向destX
mScroller.startScroll(scrollX,0,delta,0,2000);
invalidate();
}

最后我们在Activity.中调用CustomView的smoothScrollTo()方法:

          //使用Scroll来进行平滑移动
          mCustomView.smoothScrollTo(-400,0);

这里我们是设定CustomView沿着X轴向右平移400像素。

如果还有更好的欢迎指出补充

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android UI详解之View绘制原理

Android View绘制原理详解     Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类,由此就得到了视图...
  • UStory
  • UStory
  • 2015年01月06日 14:32
  • 1642

android两种方式中自己画一个圆,实现单点触控时拖动图片,跟着拖动点走,并且可以放大或缩小

MainActivity类public class MainActivity extends Activity { View view; public static final int ...
  • Dr_abandon
  • Dr_abandon
  • 2016年11月10日 21:02
  • 1234

Android自绘动画实现与优化实战

前言 我们所熟知的,Android 的图形绘制主要是基于 View 这个类实现。 每个 View 的绘制都需要经过 onMeasure、onLayout、onDraw 三步曲,分别对应到测量大小、布...
  • u012608587
  • u012608587
  • 2016年07月25日 15:56
  • 1055

Android绘图机制(一)——自定义View的基础属性和方法

自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目前的状况吧,结束了一个项目,现在接手一个新的项目,老项目的时候自...
  • qq_26787115
  • qq_26787115
  • 2016年01月04日 17:36
  • 4155

Android绘图机制(一)——自定义View的基础属性和方法

标签: android动画实例图形数据 2016-01-04 17:36 1832人阅读 评论(6) 收藏 举报  分类: Android(110)  版权声明:本...
  • u010854167
  • u010854167
  • 2016年12月08日 16:52
  • 164

android实现view滑动的7种方法

晚上十一点了,今天可能写不完了,持续更新中.... 这里讲的都是思路,以及目前经常使用的方法,代码在最后一次更新时上传, 实现滑动的7中方法 1:layout 方法 2:offsetLeftAndRi...
  • fkgjdkblxckvbxbgb
  • fkgjdkblxckvbxbgb
  • 2017年01月10日 23:14
  • 198

android view实现滑动的六种方法

主要讲述android view的滑动实现的六种方法
  • feiniao20146773
  • feiniao20146773
  • 2016年11月09日 13:10
  • 176

Android实现View滑动的五种方法

PS:本文不讲解动画实现view的滑动,主要讲通过onTouchEvent进行滑动。
  • qq1377399077
  • qq1377399077
  • 2016年11月09日 15:23
  • 120

Android进阶-View系列(二)-实现滑动的七种方法

Android进阶-View系列(二)-实现滑动的七种方法
  • Jsagacity
  • Jsagacity
  • 2017年11月18日 16:14
  • 107

Android绘图系列(一)——自定义View基础

这个系列主要是介绍下Android自定义和Android绘图机制,自己能力有限,如果在介绍过程中有什么错误,欢迎指正 一.自定义View常用的方法首先用一张图来表示自定义View绘制流程函数调用链(简...
  • Greathfs
  • Greathfs
  • 2017年02月02日 18:27
  • 1130
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android绘图基础之实现View滑动的方法
举报原因:
原因补充:

(最多只允许输入30个字)