2017-04-21 1 views
0

이 코드가 있는데 문제는 OnClickListener에 있습니다. 일반적으로 onClickListener는 사용하지 않지만 onClick 속성을 설정하는 활동이 없기 때문에 사용합니다.OnClickListener가 원하는대로 작동하지 않습니다.

잠시 동안 손가락을 뗀 후에도 손가락이 튀어 나올 때 트리거됩니다. 클릭 한 것처럼 쇠퇴하지 않습니다. OnTouchListener 및 사례 : MotionEvent.ACTION_UP을 만들 때와 같습니다.

빨리 감을 때만 트리거해야합니다.

import android.app.Service; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.os.IBinder; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.ImageView; 
public class Bubble extends Service{ 
private WindowManager windowManager; 
private ImageView chatHead; 

@Override 
public IBinder onBind(Intent intent){ 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate(){ 
    super.onCreate(); 

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    chatHead = new ImageView(this); 
    chatHead.setImageResource(R.drawable.floating); 

    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSPARENT); 

    params.gravity = Gravity.DISPLAY_CLIP_HORIZONTAL | Gravity.DISPLAY_CLIP_VERTICAL| Gravity.START; 
    params.x = 0; 
    params.y = 100; 
    params.alpha = 0.5f; 
    windowManager.addView(chatHead, params); 

    chatHead.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      Intent dialogIntent = new Intent(Bubble.this, MainActivity.class); 
      dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(dialogIntent); 
     } 
    }); 

    try{ 
     chatHead.setOnTouchListener(new View.OnTouchListener(){ 
      private WindowManager.LayoutParams paramsF = params; 
      private int initialX; 
      private int initialY; 
      private float initialTouchX; 
      private float initialTouchY; 


      @Override 
      public boolean onTouch(View v, MotionEvent event){ 
       switch (event.getAction()){ 
        case MotionEvent.ACTION_DOWN: 
         initialX = paramsF.x; 
         initialY = paramsF.y; 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 
         break; 
        case MotionEvent.ACTION_UP: 
         return false; 
        case MotionEvent.ACTION_MOVE: 
         paramsF.x = initialX + (int) (event.getRawX() - initialTouchX); 
         paramsF.y = initialY + (int) (event.getRawY() - initialTouchY); 
         windowManager.updateViewLayout(chatHead , paramsF); 
         break; 
       } 
       return false; 
      } 
     }); 
    }catch(Exception ignored){} 
} 
+0

터치는 클릭을 제어합니다. 어떤 경우에는 true를 반환 할 수 있습니다. 그러나 –

+0

고마워요. 시도했지만 clickListener도 작동하지 않습니다. –

+0

클릭 리스너 로직을 'ACTION_UP'케이스로 옮길 수 있습니다. – azizbekian

답변

0

GestureDetector를 사용하여 단일 탭인지 완벽하게 작동하는지 감지합니다.

import android.app.Service; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.os.IBinder; 
import android.view.GestureDetector; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.ImageView; 

public class Bubble extends Service{ 
    private WindowManager windowManager; 
    private ImageView chatHead; 
    private GestureDetector gestureDetector; 

    @Override 
    public IBinder onBind(Intent intent){ 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 

     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     chatHead = new ImageView(this); 
     chatHead.setImageResource(R.drawable.floating); 
     gestureDetector = new GestureDetector(this, new SingleTapConfirm()); 

     final WindowManager.LayoutParams params = new  WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSPARENT); 

     params.gravity = Gravity.DISPLAY_CLIP_HORIZONTAL | Gravity.DISPLAY_CLIP_VERTICAL| Gravity.START; 
     params.x = 0; 
     params.y = 100; 
     params.alpha = 0.5f; 
     windowManager.addView(chatHead, params); 

     try{ 
      chatHead.setOnTouchListener(new View.OnTouchListener(){ 
       private WindowManager.LayoutParams paramsF = params; 
       private int initialX; 
       private int initialY; 
       private float initialTouchX; 
       private float initialTouchY; 

       @Override 
       public boolean onTouch(View v, MotionEvent event){ 
        if (gestureDetector.onTouchEvent(event)) { 
         Intent dialogIntent = new Intent(Bubble.this, MainActivity.class); 
         dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(dialogIntent); 
         return true; 
        } else { 
         switch (event.getAction()){ 
          case MotionEvent.ACTION_DOWN: 
           initialX = paramsF.x; 
           initialY = paramsF.y; 
           initialTouchX = event.getRawX(); 
           initialTouchY = event.getRawY(); 
           break; 
          case MotionEvent.ACTION_UP: 
           return false; 
          case MotionEvent.ACTION_MOVE: 
           paramsF.x = initialX + (int) (event.getRawX() - initialTouchX); 
           paramsF.y = initialY + (int) (event.getRawY() - initialTouchY); 
           windowManager.updateViewLayout(chatHead , paramsF); 
           break; 
         } 
        } 

        return false; 
       } 
      }); 
     }catch(Exception ignored){} 
    } 

    private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener { 

     @Override 
     public boolean onSingleTapUp(MotionEvent event) { 
      return true; 
     } 
    } 
관련 문제