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