在下面的代码中,我有一个浮动布局,它是 MATCH_PARENT,也就是说,它隐藏了所有屏幕空间,到目前为止一切都很好。
我想点击并按下屏幕并按下我的手指以能够点击按钮或浮动图像,我不知道是否可能但Android检测到多点触控,我不知道该怎么做这个。
public class GlobalTouchService extends Service implements OnTouchListener{
private String TAG = this.getclass().getSimpleName();
// gerenciador de janela
private WindowManager mWindowManager;
private Context mContext;
// layout linear será usado para detectar evento de toque
private LinearLayout touchLayout;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// criar layout linear
touchLayout = new LinearLayout(this);
// a largura e a altura é igual à tela inteira
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
touchLayout.setLayoutParams(lp);
// defina a cor se quiser que o layout fique visível na tela
//touchLayout.setBackgroundColor (Color.CYAN);
// definido no ouvinte de toque
touchLayout.setOnTouchListener(this);
// buscar objeto gerenciador de janelas
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// definir o parâmetro de layout do gerenciador de janelas
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
30,// largura do layout 30 px
WindowManager.LayoutParams.MATCH_PARENT,// a altura é igual à tela inteira
WindowManager.LayoutParams.TYPE_PHONE,// Digite Ohone,Estas são janelas não relacionadas ao aplicativo que fornecem interação do usuário com o telefone (em particular,chamadas recebidas).
WindowManager.LayoutParams.flaG_NOT_FOCUSABLE,// esta janela nunca terá o foco de entrada principal
PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.LEFT | Gravity.TOP;
Log.i(TAG,"add View");
mWindowManager.addView(touchLayout,mParams);
}
@Override
public void onDestroy() {
/* if(mWindowManager != null) {
if(touchLayout != null) mWindowManager.removeView(touchLayout);
}*/
super.onDestroy();
}
@Override
public boolean onTouch(View v,MotionEvent event) {
//Exemplo multitoque
/*
1 . Eventos multitoque :
Eventos multitoque action de pointerIndex E o código de ação para realizar a operação OR para sintetizar
transferir event.getactionmasked() Para obter o código de ação,escudo pointerIndex Índice de toque
2 . PointerId 和 PointerIndex :
Pointer Ponto de toque ;
Características dos dois valores:
PointerId: representa exclusivamente um ponto de contato,se o valor for tocado e movido arbitrariamente,desde que não seja levantado,ele não mudará;
PointerIndex: O índice do ponto de contato,que é um valor contínuo contando a partir de 0,e também é o 0º índice,que pode representar diferentes pontos de contato;
Mecanismo operacional:
PointerId: Enquanto estiver pressionado e não levantado,o valor não muda.Se o dedo médio for levantado,haverá uma situação de oco;
Pressione com 3 dedos,PointerId é 1,2 e 3,respectivamente;
Levante no meio,então o valor de ID de PointerId ficará vazio,e o ID dos dois dedos são 1 e 3,respectivamente
PointerIndex: pressionado com 3 dedos,se o segundo dedo for levantado,o índice do terceiro subsequente mudará de 2 para 1,e a substituição será substituída em ordem
Conversão PointerId e PointerIndex:
O pointerId é determinístico,e o PointerIndex tem a característica de preenchimento sequencial,que é indeterminado
O valor PointerIndex do pointerId especificado pode ser obtido por meio do método findPointerIndex (int pointerId)
3. Obtenha as coordenadas:
Obtenha as coordenadas atuais: event.getX ();
Obtenha as coordenadas do pointerIndex especificado: event.getX (pointerIndex);
4. Cinco eventos de multitoque:
Um único toque precisa lidar com actION_DOWN,actION_MOVE,actION_UP
O multitoque precisa lidar com actION_DOWN,actION_UP,actION_POINTER_DOWN,actION_POINTER_UP
Essas ações no multitoque têm significados diferentes:
actION_DOWN: pressione o primeiro dedo
actION_MOVE: todos os eventos de deslizamento do dedo
actION_UP: o último dedo é levantado
actION_POINTER_DOWN: O dedo médio está pressionado (o dedo já está pressionado)
actION_POINTER_UP: O dedo médio é levantado (há o dedo em contato)
5. Comparação de multitoque e único toque
Mais dois eventos actION_POINTER_DOWN e actION_POINTER_UP
Adicionada identificação de ID de ponto de toque e mecanismo de índice de ponto de toque
*/
// 1. Obter coordenadas
//1.1 Obtenha as coordenadas x e y do evento de toque atual
float x = event.getX();
float y = event.getY();
//1.2 Obtenha as coordenadas xey do pointerIndex especificado (obtenha as coordenadas do 0º índice)
int pointerIndex = 0;
float x_pointer = event.getX(pointerIndex);
float y_pointer = event.getY(pointerIndex);
//2 . Obtenha atributos relacionados a eventos de toque
//Obtenha o evento de toque multitoque atual
int actionmasked = event.getactionmasked();
//Obtenha o pointerIndex correspondente a este evento
int actionIndex = event.getactionIndex();
//Obtenha o número atual de pontos de contato
int pointCount = event.getPointerCount();
// 3. Obtenha o PointerIndex correspondente a PointerId
// Encontre o valor do índice do primeiro dedo pressionado
pointerIndex = event.findPointerIndex(0);
//4 . Lidar com a operação de evento correspondente
switch (actionmasked){
case MotionEvent.actION_DOWN : //Pressione o primeiro dedo
Log.i("TAG","actION_DOWN : Pressionou o primeiro dedo");
break;
case MotionEvent.actION_MOVE : //Movimento do dedo
Log.i("TAG","actION_MOVE : Movimentou o dedo");
break;
case MotionEvent.actION_UP : //Levante o último dedo
Log.i("TAG","actION_UP : Levantou o último dedo");
break;
case MotionEvent.actION_POINTER_DOWN : //O dedo médio pressiona (o dedo já está pressionado)
Log.i("TAG","actION_POINTER_DOWN : O dedo médio pressiona (o dedo já está pressionado)");
break;
case MotionEvent.actION_POINTER_UP : //Dedo médio levantado (o dedo ainda está se tocando)
Log.i("TAG","actION_POINTER_UP : Dedo médio levantado (o dedo ainda está se tocando)");
break;
}
return true;
}
}
}