Android:View随手指移动

View的自动移动,我们可以设置动画,如之类提到的 ViewCompatAnimation

如何是View随着手指的移动而移动呢? 

onTouch事件实现

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            moveView(view, event.getRawX(), event.getRawY());
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}

 

说明:

onTouch(View view,MotionEvent event)这个方法

getRawX()和getRawY()获得的是相对屏幕的位置,

getX()和getY()获得的永远是view的触摸位置坐标这两个值不会超过view的长度和宽度)。

如是Activity的 onTouchEvent(MotionEvent event) 方法,这个时候获得的是屏幕点击位置的坐标。getRawX()与getX()访求获取的值是一样的。

 

方法1:setLayoutParams

/**

   * 设置View的布局属性,使得view随着手指移动 注意:view所在的布局必须使用RelativeLayout 而且不得设置居中等样式  

   */

 private void moveView(View view, float rawX, float rawY) {
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view
            .getLayoutParams();
    params.leftMargin = (int) rawX - ivMove.getWidth() / 2;
    params.topMargin = (int) rawY - topTitleHeight - ivMove.getHeight() / 2;
    view.setLayoutParams(params);
}

 

 

方法2:view.layout(l,t,r,b)

/**
 * 通过layout方法,移动view 
 * 优点:对view所在的布局,要求不苛刻,不要是RelativeLayout,而且可以修改view的大小
 */
private void moveViewByLayout(View view, int rawX, int rawY) {
    int left = rawX - ivMove.getWidth() / 2;
    int top = rawY - topTitleHeight - ivMove.getHeight() / 2;
    int width = left + view.getWidth();
    int height = top + view.getHeight();
    view.layout(left, top, width, height);
}

 

方法3:ScrollBy()或者ScrollTo();

/** 

 * 在activity中实现
 * scrollBy() 相对于当前的坐标进行偏移
 * scrollTo() 相对于屏幕的左上角进行偏移
 @param event
 */
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            currentX= (int) event.getX();
            currentY= (int) event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            int x2= (int) event.getX();
            int y2= (int) event.getY();
            container.scrollBy(currentX - x2, currentY - y2);
            currentY=y2;
            currentX=x2;
            xyValue.setText(x2+","+y2);
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}

 





原文地址:https://www.cnblogs.com/ut2016-progam/p/5345308.html