View的滑动 利用onTouchEvent实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<com.example.viewscroll.MyView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/colorPrimaryDark"
/>

</LinearLayout>





package com.example.viewscroll;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}




package com.example.viewscroll;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {
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);
}


int lastX,lastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
//使用getxgetY实现view移动
//A:
// int x = (int) event.getX();
// int y = (int) event.getY();
//使用getrawxrawY,实现移动; rawXrawY始终代表最新位置
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//B:
// lastX = x;
// lastY = y;
//手指落下的时候记住初始位置
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_UP:
break;

case MotionEvent.ACTION_MOVE:
// C:
// int offsetX = x - lastX;
// int offsetY = y - lastY;
//滑动的时候记录下 xy的变化量 或者偏移量
int offsetX = rawX-lastX;
int offsetY = rawY-lastY;


    //这个函数用来重新摆放view的位置
layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
// 位置更新完成之后 再次记录初始位置
lastX = rawX;
lastY = rawY;
break;
}
return true;



}
}


另外

使用LayoutParams()  也可以重新摆放view的位置 

我们可以使用LayoutParams的方法来实现view的移动,LayoutParams可以设置view的位置,

也可以通过geLayoutParams方法来获得当前view的位置。自然也可以使用setLayoutParams方法来修改View的位置,

结合TouchEvent方法就可以让View进行变动。
a: 获取偏移量的方法和前两个一样,
b:这里的LayoutParams,是根据父类的类型来定的。是 LinearLayout.LayoutParams ,还是RelativeLayout.LayoutParams 。。。等

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




另外调用

//也可以使view跟手滑动
((View) getParent()).scrollBy(-offsetX, -offsetY);












posted @ 2019-08-22 00:39  pushu007  阅读(440)  评论(0编辑  收藏  举报