一、新建一個R.layout.activity_main佈局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
tools:context=".MainActivity">
<com.wq.toucheventdemo.MyTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:text="Hello World!"
/>
</LinearLayout>
二、自定義MyTextView
/**
* 描述 實現一個滑動View的位置改變
* 創建 wangqi
* 日期 2020/6/1
*/
public class MyTextView extends AppCompatTextView {
private static final String TAG = "wq892373445";
public MyTextView(Context context) {
super(context);
Log.d(TAG,"MyTextView()");
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.d(TAG,"MyTextView()");
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Log.d(TAG,"MyTextView()");
}
private float mPreY = 0;
private float sensity = 5;
private float delta = 0.0f;
private float mRawY = 0;
private float mPreX = 0;
private float sensityX = 5;
private float deltaX = 0.0f;
private float mRawX = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG,"onTouchEvent() event.getAction()" +event.getAction());
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mPreY = event.getY();
mRawY = event.getRawY();
mPreX = event.getX();
Log.d(TAG,"onTouchEvent() ACTION_DOWN mPreY " +mPreY);
Log.d(TAG,"onTouchEvent() mRawY " +mRawY);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
Log.d(TAG,"onTouchEvent() ACTION_MOVE 1 event.getY() " +event.getY());
delta = event.getY() - mPreY;
deltaX = event.getX() - mPreX;
Log.d(TAG,"onTouchEvent() delta " +delta);
mPreY = event.getY();
if (delta > sensity || delta < -5) { // simplly missing click
onScrollY(delta);
}
if (deltaX > sensityX || deltaX < -5) { // simplly missing click
onScrollX(deltaX);
}
Log.d(TAG,"onTouchEvent() ACTION_MOVE 2 event.getY() " +event.getY());
}else if (event.getAction() == MotionEvent.ACTION_UP) {
mPreY = event.getY();
Log.d(TAG,"onTouchEvent() ACTION_UP mPreY " +mPreY);
}
return true;
}
private float curY;
private int scroolDelta;
private int mParentWidth = 1600;
private int mParentHeight = 400;
public void onScrollY(float curDelta) {
Log.d(TAG,"onScroll() curDelta " +curDelta);
curY = getTranslationY();
curY = curY + curDelta;
Log.d(TAG,"onScroll() curY= " + curY);
scroolDelta = 5;
if (scroolDelta > 0) {
if (curY < 0) {
curY = 0;
} else if (curY > scroolDelta) {
curY = scroolDelta;
}
setTranslationY(curY);
} else {
if (curY > 0) {
curY = 0;
} else if (curY < scroolDelta) {
curY = scroolDelta;
}
setTranslationY(curY);
}
Log.d(TAG,"onScroll curY =" + curY + " scroolDelta; " + scroolDelta + " scroolDelta ; " + scroolDelta);
}
private float curX;
private int scroolDeltaX;
private int mParentWidthX = 1600;
private int mParentHeightX = 400;
public void onScrollX(float curDelta) {
Log.d(TAG,"onScroll() curDelta " +curDelta);
curX = getTranslationX();
curX = curX + curDelta;
Log.d(TAG,"onScroll() curY= " + curY);
scroolDeltaX = 5;
if (scroolDeltaX > 0) {
if (curX < 0) {
curX = 0;
} else if (curX > scroolDeltaX) {
curX = scroolDeltaX;
}
setTranslationX(curX);
} else {
if (curX > 0) {
curX = 0;
} else if (curX < scroolDeltaX) {
curX = scroolDeltaX;
}
setTranslationY(curX);
}
Log.d(TAG,"onScrollX curX =" + curX + " scroolDeltaX; " + scroolDeltaX + " scroolDeltaX ; " + scroolDeltaX);
}
}