1. theory Api events:
MontionEvent touch operation
download generate once, press
move move will be called here several times
up to produce once, release
getX (): Gets X-axis coordinates, the original key button things happen themselves
getRawX (): Now for the top left corner
of the screen type :
resistance screen: a pressure sensor pressed, soft screen
capacitive screen: now for low current sensitive screen, hard screen
event propagation:
screen - "kernel Linxu -" profit is transmitted to the application - "current Activity-" event distribution dispachTouchEvent (MontionEvent event )
-> button in response to the event
- "If the consumer button, then deal with their own Activity
2. Event theoretical analysis:
activity_main.xml layout file:
<?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="lanya.denganzhi.com.montioneventtest.Main2Activity"
android:orientation="vertical">
<ImageView
android:id="@+id/moveImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher"
android:layout_marginLeft="30dp"
android:layout_marginTop="50dp"/>
</LinearLayout>
MyImageView Code:
package lanya.denganzhi.com.montioneventtest;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
/**
* Created by Administrator on 20-3-8.
*/
public class MyImageView extends android.support.v7.widget.AppCompatImageView {
public MyImageView(Context context) {
super(context);
}
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 分发
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.e("denganzhi","ImageView--dispatchTouchEvent:"+event.getAction());
return super.dispatchTouchEvent(event);
}
// 处理
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("denganzhi","ImageView--onTouchEvent:"+event.getAction());
return super.onTouchEvent(event);
}
}
MainActivity Code:
package lanya.denganzhi.com.montioneventtest;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
MyImageView myImageView=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myImageView = (MyImageView) findViewById(R.id.myImageView);
myImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("denganzhi","myImageView--setOnTouchListener:"+event.getAction());
return true;
}
});
}
//
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.e("denganzhi","MainActivity--dispatchTouchEvent:"+event.getAction());
return super.dispatchTouchEvent(event);
}
//
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("denganzhi","MainActivity--onTouchEvent:"+event.getAction());
// MotionEvent.ACTION_DOWN 0
// MotionEvent.ACTION_MOVE // 1
// MotionEvent.ACTION_UP //2
return super.onTouchEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.e("denganzhi1","key--dispatch:"+event.getKeyCode());
return super.dispatchKeyEvent(event);
}
}
************************************************** ***************
View Api:
boolean onTouchEvnet (MontionEvent Evnet): calling a method called deal, it returns true representation of the consumer events
down event:
MainActivity - dispatchTouchEvent: 0 down event , activity distribution
ImageView - dispatchTouchEvent: 0 activity distributed to the ImageView
myImageView - setOnTouchListener: 0 setOnTouch event of the ImageView call, do not consume, passing up
ImageView - onTouchEvent: 0 imageview rewrite onTouch method calls
MainActivity - onTouchEvent: 0 activity rewrite onTouch method invocation, final consumption time
move the event:
MainActivity - dispatchTouchEvent: 2
MainActivity - onTouchEvent: 2 // move events do not call ImageViw of dispatch distributed directly to consumer activity
up event:
MainActivity - dispatchTouchEvent: 1 // up event not to call the dispatch ImageViw distributed directly to consumer activity
MainActivity - onTouchEvent: 1
Summary: If the event is not the first time down the consumer, behind the move, up events are not distributed
***************************** ************************************
Down event:
myImageView.setOnTouchListener return to true
MainActivity - dispatchTouchEvent: 0 down event, activity distribution
ImageView - dispatchTouchEvent: 0 activity distributed to the ImageView
myImageView - setOnTouchListener: 0 returns true, then the time has been consumed, time to stop
the move event:
MainActivity - dispatchTouchEvent: 2
the ImageView - dispatchTouchEvent: 2
myImageView- -setOnTouchListener: 2 consumption
up event:
MainActivity - dispatchTouchEvent: 1
the ImageView - dispatchTouchEvent: 1
myImageView - setOnTouchListener: 1 consumption
*****************************************************************************************
2. Implement drag and drop images:
View view of Api:
getLeft (), getTop (): the top left vertex coordinates for the origin of coordinates is now
getRight (), getBottom () the lower right corner relative to the origin coordinate
layout (int left, top, right , bottom): repositioning of view
************************************************** ***************
achieve pseudo-code drag pictures:
pictures by dragging principle:
lastX
lastY
eventX
eventY
MontionEvent.down
// 1. press to obtain the coordinates of the point
lastX = event.getRawX ( );
lastY evnet.getRawY = ();
MontionEvent.move
// 2. Get move down with respect to the moving distance
eventX event.getRawX = ();
eventY event.getRawY = ();
DX = eventX - lastX;
Dy = eventY- lastY;
// 3. repositioned
left imageview.getLeft = () + DX;
Top imageview.getTop = () + Dy;
right = imageview.getRight () + DX;
bottom + Dy = imageview.getBottom:
imageview.layout (left, Top, right, bottom)
// 4. Preparing for the next move
lastX = eventX
lastY = eventY
*********************** ******************************************
Source:
<?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="lanya.denganzhi.com.montioneventtest.Main2Activity"
android:orientation="vertical">
<ImageView
android:id="@+id/moveImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher"
android:layout_marginLeft="30dp"
android:layout_marginTop="50dp"/>
</LinearLayout>
Main2Activity 代码:
package lanya.denganzhi.com.montioneventtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class Main2Activity extends AppCompatActivity {
ImageView moveImg;
float lastX ,lastY ; //上次位移
float eventX , eventY; // 当前坐标
private LinearLayout parent;
float parentBottom,parentRight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
moveImg = (ImageView)findViewById(R.id.moveImg);
parent = (LinearLayout) moveImg.getParent(); //parentBottom、parentRight 马上去取为0
moveImg.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// 得到父视图的 right/bottom
if(parentRight==0){
parentRight= parent.getRight();
parentBottom= parent.getBottom();
}
lastX= event.getRawX();
lastY =event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
eventX = event.getRawX();
eventY = event.getRawY();
float dx= eventX -lastX;
float dy= eventY -lastY;
float left = moveImg.getLeft() + dx;
float top =moveImg.getTop() + dy;
float right = moveImg.getRight() + dx;
float bottom = moveImg.getBottom() + dy;
// 不能移动到外面去
if(left<0){
right = right + (-left);
left=0; // 那么已经移除了left,right也要复原,加上移除的left
}
// 不能移出到左边
if(top < 0){
bottom = bottom + (-top);
top = 0;
}
// 不能移出到右边
if(right > parentRight){
left= left - (right - parentRight);
right= parentRight;
}
if(bottom > parentBottom){
top = top - (bottom - parentBottom);
bottom = parentBottom;
}
moveImg.layout((int)left,(int)top,(int)right,(int)bottom);
lastX= eventX;
lastY=eventY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
});
}
}
Above:
3. KeyEvent: Event
Basic types: down: finger press, will be called many times
up: the finger moves
to achieve double-click the keyboard back exit
//
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.e("denganzhi","MainActivity--dispatchTouchEvent:"+event.getAction());
return super.dispatchTouchEvent(event);
}
//
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("denganzhi","MainActivity--onTouchEvent:"+event.getAction());
// MotionEvent.ACTION_DOWN 0
// MotionEvent.ACTION_MOVE // 1
// MotionEvent.ACTION_UP //2
return super.onTouchEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.e("denganzhi1","key--dispatch:"+event.getKeyCode());
return super.dispatchKeyEvent(event);
}
// 会被 调用多次
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 如果要监听back,home键,必须设置下面这2个Api
// startTracking 和 return true;
event.startTracking();
// event.getKeyCode() //获取按键
Log.e("denganzhi1","key--down");
return true;
}
boolean isExit=false;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==100){
isExit=false;
}
}
};
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.e("denganzhi1","key--up");
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
if(!isExit){
isExit=true;
handler.sendEmptyMessageDelayed(100,4000);
Toast.makeText(MainActivity.this,"退出",Toast.LENGTH_SHORT).show();
return true;
}
// 否则退出 执行super,4s 以后 有需要双击
}
return super.onKeyUp(keyCode, event);
}
@Override
protected void onDestroy() {
handler.removeMessages(100);
super.onDestroy();
}
// 长按监听
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
Log.e("denganzhi1","key--long");
return super.onKeyLongPress(keyCode, event);
}