mecanismo de eventos andoid

1. eventos teoria API:

 MontionEvent toque operação
    de download gerar uma vez, pressione    
    move move será chamado aqui várias vezes  
    para produzir uma vez, solte
    
    getX (): Obtém coordenadas X-eixo, o botão de chave original coisas acontecem si
    getRawX (): Agora para o canto superior esquerdo
    
    do tipo de tela :
    tela de resistência: um sensor de pressão pressionado, tela macia
    tela capacitiva:-se agora para baixa corrente tela sensível, difícil tela
    propagação do evento:
    tela - "kernel do Linxu -" lucro é transmitido para a aplicação - "atual Activity" distribuição de eventos dispachTouchEvent (evento MontionEvent )
    -> botão em resposta ao evento
    - "Se o botão do consumidor, então lidar com sua própria atividade

 2. Evento análise teórica:

arquivo de layout activity_main.xml: 

<?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:
    boolean onTouchEvnet (MontionEvent Evnet): chamar um método chamado negócio, ele retorna verdadeira representação dos eventos de consumo
    
para baixo o evento:
     MainActivity - dispatchTouchEvent: 0 para baixo o evento , distribuição atividade
     ImageView - dispatchTouchEvent: 0 atividade distribuído para o ImageView
     myImageView - setOnTouchListener: 0 evento setOnTouch da chamada ImageView, não consomem, passando por cima

     ImageView - onTouchEvent: 0 ImageView reescrever método OnTouch chama
     MainActivity - onTouchEvent: 0 Atividade reescrever OnTouch invocação de método, tempo de consumo final
mover o evento: 
   MainActivity - dispatchTouchEvent: 2
    MainActivity - onTouchEvent: 2 // eventos de movimentação não chamar ImageViw de envio distribuídos diretamente para a atividade de consumo 

-se evento:
   MainActivity - dispatchTouchEvent: 1 //-se caso não chamar o ImageViw expedição distribuídos diretamente para a atividade de consumo 
   MainActivity - onTouchEvent: 1

 Resumo: Se o evento não é a primeira vez para baixo o consumidor, por trás do movimento, se eventos não são distribuídos
***************************** ************************************   
evento Down: 
    myImageView.setOnTouchListener retorno à verdadeira
     MainActivity - dispatchTouchEvent: 0 para baixo o evento, distribuição atividade
     ImageView - dispatchTouchEvent: 0 atividade distribuído para o ImageView
     myImageView - setOnTouchListener: 0 retorna verdade, então o tempo tem sido consumida, tempo para parar
    
  o evento move: 
   MainActivity - dispatchTouchEvent: 2
    a ImageView - dispatchTouchEvent: 2     
   myImageView- -setOnTouchListener: 2 consumo
   
    acima evento:
   MainActivity - dispatchTouchEvent: 1
   a ImageView - dispatchTouchEvent: 1
 myImageView - setOnTouchListener: um consumo
 
 ************************************************** ***************************************

 2. Implementar imagens de arrastar e soltar:

 Ver vista da Api:
   Getleft (), getTop (): o superior esquerdo coordenadas dos vértices para a origem das coordenadas é agora
   getRight (), getBottom () do canto inferior direito em relação à origem coordenar
   layout (int esquerda, superior direita , inferior): reposicionamento de vista

 ************************************************** ***************
 alcançar pseudo-código arrastar as imagens:
  fotos por princípio arrastando:
  lastX
  Lasty
  eventX
  eventY 
 MontionEvent.down
  // 1. pressione para obter as coordenadas do ponto
   lastX = event.getRawX ( );
   Lasty evnet.getRawY = ();
 MontionEvent.move
     // 2. Get jogada com relação à distância movendo
    eventX event.getRawX = ();
    eventY event.getRawY = ();
    DX = eventX - lastX;
    Dy = eventY- Lasty; 
    // reposicionada 3.
    esquerda imageview.getLeft = () + DX;
    Top imageview.getTop = () + Dy;
    direito = imageview.getRight () + DX;
    fundo + Dy = imageview.getBottom:
    imageview.layout (esquerda, superior, direita e inferior)
    // 4. Preparar para o próximo movimento
    lastX = eventX
    Lasty = eventY
*********************** ******************************************

fonte: 

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

acima:

3. KeyEvent: Evento

tipos básicos: baixo: imprensa dedo, vai ser chamado muitas vezes
          se: as dedo se move
   para alcançar clique duas vezes a saída do teclado de volta

    //
    @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 artigos originais · Louvor obteve 76 · vista 120 000 +

Acho que você gosta

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