1. Eventos teoría de la API:
MontionEvent operación táctil
descarga generar una vez, pulse
mover mover será llamado aquí varias veces
para producir una vez, liberar
getX (): Obtiene las coordenadas del eje X, las cosas botón llave original se producen a sí mismos
getRawX (): Ahora para la esquina superior izquierda
de la pantalla de tipo :
pantalla de la resistencia: un sensor de presión presiona, suave pantalla
pantalla capacitiva: ahora para pantalla de baja corriente sensible, duro pantalla
propagación evento:
pantalla - "kernel Linxu -" ganancia se transmite a la aplicación - "actual Actividad-" dispachTouchEvent distribución de eventos (evento MontionEvent )
-> en respuesta al evento
- "Si el botón del consumidor, a continuación, tratar con su propia actividad
2. Evento análisis teórico:
activity_main.xml archivo de diseño:
<?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>
Código MyImageView:
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);
}
}
Código MainActivity:
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);
}
}
************************************************** ***************
Ver Api:
booleano onTouchEvnet (MontionEvent Evnet): llamar a un método llamado acuerdo, se vuelve verdadera representación de los eventos de consumo
el evento:
MainActivity - dispatchTouchEvent: 0 deposito evento , la distribución de la actividad
ImageView - dispatchTouchEvent: 0 actividad distribuida a la ImageView
myImageView - setOnTouchListener: 0 fiesta setOnTouch de la llamada ImageView, no consume, dejando pasar
ImageView - onTouchEvent: 0 imageview reescribir método onTouch llama
MainActivity - onTouchEvent: 0 Actividad reescribir onTouch invocación de método, el tiempo de consumo final
trasladar el evento:
MainActivity - dispatchTouchEvent: 2
MainActivity - onTouchEvent: 2 // eventos de movimiento no llame ImageViw de envío distribuido directamente a la actividad de consumo
hasta eventos:
MainActivity - dispatchTouchEvent: 1 // arriba evento que no llame a la ImageViw despacho distribuido directamente a la actividad de consumo
MainActivity - onTouchEvent: 1
Resumen: Si el evento no es la primera vez por el consumidor, detrás de la medida, hasta eventos no se distribuyen
***************************** ************************************
Down caso:
myImageView.setOnTouchListener retorno a la verdadera
MainActivity - dispatchTouchEvent: 0 abajo acontecimiento, actividad de distribución
ImageView - dispatchTouchEvent: 0 actividad distribuida a la ImageView
myImageView - setOnTouchListener: 0 devuelve cierto, entonces se ha consumido el tiempo, el tiempo para detener
el evento movimiento:
MainActivity - dispatchTouchEvent: 2
el ImageView - dispatchTouchEvent: 2
myImageView- -setOnTouchListener: 2 el consumo
de hasta eventos:
MainActivity - dispatchTouchEvent: 1
ImageView - dispatchTouchEvent: 1
myImageView - setOnTouchListener: 1 consumo
************************************************** ***************************************
2. Poner en práctica de arrastrar y soltar imágenes:
Ver vista de Api:
getLeft (), getTop (): la parte superior izquierda coordenadas de los vértices para el origen de coordenadas es ahora
Getright (), getBottom () de la esquina inferior derecha con respecto al origen de coordenadas
de diseño (int izquierda, arriba, derecha , abajo): el reposicionamiento de vista
************************************************** ***************
lograr pseudo-código de arrastre imágenes:
las imágenes de principio arrastrando:
LASTx
Lasty
eventX
Eventy
MontionEvent.down
// 1. prensa para obtener las coordenadas del punto
LASTx = event.getRawX ( );
Lasty evnet.getRawY = ();
MontionEvent.move
// 2. Get movimiento hacia abajo con respecto a la distancia de movimiento
eventX event.getRawX = ();
Eventy event.getRawY = ();
DX = eventX - LASTx;
Dy = eventY- Lasty;
// 3. reposicionado
dejó imageview.getLeft = () + DX;
Top imageview.getTop = () + Dy;
derecha = imageview.getRight () + DX;
parte inferior + Dy = imageview.getBottom:
imageview.layout (izquierda, arriba, derecha, abajo)
// 4. La preparación para el siguiente movimiento
LASTx = eventX
Lasty = Eventy
*********************** ******************************************
fuente:
<?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;
}
});
}
}
arriba:
3. KeyEvent: Evento
tipos básicos: abajo: presionar con los dedos, serán llamados muchas veces
hasta: el dedo se mueve
para lograr haga doble clic en la salida trasera del teclado
//
@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);
}