Android群英传——第五章实现滑动的7种方法(一二三)

实现滑动的基本思想:

  • 当触摸View时,系统记下当前的坐标
  • 当手指移动时,系统记下当前移动点的坐标
  • 从而获取了一个偏移量
  • 通过这个偏移量修改这个View的坐标
  • 即可实现滑动的过程

    要实现的效果如下: 
    这里写图片描述

方法一:layout方法

直接采用了基本思想:

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * Created by feathers on 16-11-15.
 */

public class MyView extends ImageView {

    private int downX;
    private int downY;

    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 1. 记录按下时的坐标
                downX = (int) event.getRawX();
                downY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                // 2. 获取发生移动时的坐标
                int moveX = (int) event.getRawX();
                int moveY = (int) event.getRawY();
                // 3. 获取偏移量
                int offsetX = moveX - downX;
                int offsetY = moveY - downY;
                Log.i("logi", "offsetX" + offsetX);
                Log.i("logi", "offsetY" + offsetY);
                Log.i("logi", "offsetX + getLeft" + offsetX + getLeft());
                Log.i("logi", "offsetY + getTop" + offsetY + getTop());
                // 4. 重新为view布局
                this.layout(getLeft()+offsetX,
                        getTop()+offsetY,
                        getRight()+offsetX,
                        getBottom()+offsetY);
                // 初始化downX和Y,以方便下次计算偏移量
                // 注意:这个偏移量第一次是按下与移动的差值,而第二次往后就是上次移动的和当前的位置的差值
                downX = (int) event.getRawX();
                downY = (int) event.getRawY();
                break;
        }
        return true;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

方法二:offsetLeftAndRight()和offsetTopAndBottom()

这是Android系统为我们提供的已经封装好的API,主要用于左右和上下移动 
重要代码如下: 

 // 4. 重新为view布局
 this.layout(getLeft()+offsetX,
    getTop()+offsetY,
    getRight()+offsetX,
    getBottom()+offsetY);               
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

替换为

offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);
  • 1
  • 2
  • 1
  • 2

即可

方法三:LayoutParams

设置LayoutParams,修改leftmargin和topmargin属性,从而完成滑动 
注意: 
1. View的LayoutParams与父ViewGroup有关,如果父控件是LinearLayout,则必须使用LinearLayout.LayoutParams(或者直接使用ViewGroup.LayoutParams) 
2. leftMargin和topMargin是相对与父控件的值,如果父控件中设置了padding,则offset的计算也要对padding进行处理,否则出现异常

同上一个方法相同只需替换第4步为以下代码即可:

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
                layoutParams.leftMargin = getLeft() + offsetX;
                layoutParams.topMargin = getTop() + offsetY;
                this.setLayoutParams(layoutParams);
posted @ 2016-11-26 15:35  天涯海角路  阅读(63)  评论(0)    收藏  举报