mecanismo de eventos Andoid

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);
    }

 

Publicado 80 artículos originales · ganado elogios 76 · vistas 120 000 +

Supongo que te gusta

Origin blog.csdn.net/dreams_deng/article/details/104741220
Recomendado
Clasificación