我希望将手指按在屏幕上并通过单击浮动按钮获得响应

在下面的代码中,我有一个浮动布局,它是 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;
    }
}
}
linguohan 回答:我希望将手指按在屏幕上并通过单击浮动按钮获得响应

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/13269.html

大家都在问