마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

잠금화면 위에 이미지뷰를 올렸는데 터치이벤트 안먹히네요

0 추천
package com.example.alwaysontop;



import android.annotation.SuppressLint;
import android.app.KeyguardManager;
import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.Toast;

@SuppressLint("ClickableViewAccessibility")
public class BackService extends Service {
	private ImageView imgView1;
	private Button btn1;

	private WindowManager.LayoutParams mParams;		//layout params 객체. 뷰의 위치 및 크기를 지정하는 객체
	private WindowManager mWindowManager;			//윈도우 매니저

	private float START_X, START_Y;							//움직이기 위해 터치한 시작 점
	private int PREV_X, PREV_Y;								//움직이기 이전에 뷰가 위치한 점
	private int MAX_X = -1, MAX_Y = -1;					//뷰의 위치 최대 값
	
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressLint("NewApi")
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();

		Point mPoint = new Point();
		mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
		Display mDisplay = mWindowManager.getDefaultDisplay();
	    mDisplay.getSize(mPoint);
	    
	    imgView1 = new ImageView(this);
		imgView1.setImageResource(R.drawable.clock);
		imgView1.setScaleType(ScaleType.FIT_XY);

		imgView1.setOnTouchListener(mViewTouchListener); //터치 이벤트 
		
		mParams = new WindowManager.LayoutParams(
				mPoint.x / 3,
				mPoint.y / 4,
				WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
				WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,	
				PixelFormat.TRANSLUCENT
				);
		
		
		mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
					  | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
					  | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
					  | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH	
					  | WindowManager.LayoutParams.FLAG_FULLSCREEN
					  | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
					  | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
						
		mParams.gravity = Gravity.LEFT | Gravity.TOP;
		mParams.verticalMargin = 0.1f;
		mParams.horizontalMargin = 0.1f;
		//myParam.gravity = Gravity.CENTER;
		mWindowManager.addView(imgView1, mParams);

	}


	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		return super.onStartCommand(intent, flags, startId);
	}

	public void toastshow(){
		Toast.makeText(this, "데이터가 연결되었습니다.", Toast.LENGTH_LONG).show();
		
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		if(imgView1 != null){
			((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(imgView1);
			imgView1 = null;

		}
		
		if(btn1 != null){
			((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(btn1);
			btn1 = null;

		}
		
		
	}

	private OnTouchListener mViewTouchListener = new OnTouchListener() {
		@Override public boolean onTouch(View v, MotionEvent event) {
			
			Log.e("뷰 터치이벤트!", "ㅇ");
			switch(event.getAction()) {
				case MotionEvent.ACTION_DOWN:				//사용자 터치 다운이면
					if(MAX_X == -1)
						setMaxPosition();
					START_X = event.getRawX();					//터치 시작 점
					START_Y = event.getRawY();					//터치 시작 점
					PREV_X = mParams.x;							//뷰의 시작 점
					PREV_Y = mParams.y;							//뷰의 시작 점
					break;
				case MotionEvent.ACTION_MOVE:
					int x = (int)(event.getRawX() - START_X);	//이동한 거리
					int y = (int)(event.getRawY() - START_Y);	//이동한 거리
					
		//터치해서 이동한 만큼 이동 시킨다
		mParams.x = PREV_X + x;
		mParams.y = PREV_Y + y;
					
		optimizePosition();		//뷰의 위치 최적화
					mWindowManager.updateViewLayout(imgView1, mParams);	//뷰 업데이트
					break;
			}
			
			return true;
		}
	};

	private void setMaxPosition() {
		DisplayMetrics matrix = new DisplayMetrics();
		mWindowManager.getDefaultDisplay().getMetrics(matrix);		//화면 정보를 가져와서
		
		MAX_X = matrix.widthPixels - imgView1.getWidth();			//x 최대값 설정
		MAX_Y = matrix.heightPixels - imgView1.getHeight();			//y 최대값 설정
	}
	

	private void optimizePosition() {
		//최대값 넘어가지 않게 설정
		if(mParams.x > MAX_X) mParams.x = MAX_X;
		if(mParams.y > MAX_Y) mParams.y = MAX_Y;
		if(mParams.x < 0) mParams.x = 0;
		if(mParams.y < 0) mParams.y = 0;
	}
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		setMaxPosition();		//최대값 다시 설정
		optimizePosition();		//뷰 위치 최적화
	}

}

안녕하세요. 안드로이드로 앱을 개발중인 초보 개발자입니다.

최상위 뷰를 통해서 잠금화면에서 특정 이미지를 선택시 앱이 자동으로

실행되도록 하는 기능을 만들고 싶은데요

검색을 통해서 이미지를  잠금화면 위에 올려놓는 것까지는 성공했는데,

이벤트가 먹히지 않아서 애를 먹고있습니다.

 WindowManager.LayoutParams의 TYPE을 설정하는 부분에

TYPE_SYSTEM_OVERLAY  으로 설정하니 잠금화면에 이미지뷰는 나오는데

이벤트가 먹히지 않고 다른 소스를 검색해보니  TYPE_PHONE으로 설정하면

터치이벤트가 먹히는데 잠금화면에 이미지뷰가 나오지 않습니다.

 위에 사진에 시계모양이 제가 띄운 이미지이고 옆에 SOS누르미라는 어플의 위젯기능인데

잠금화면 에서 자유자재로 이미지를 이동할 수 있고 꾹 누르면 앱이 실행됩니다.

같은 기능으로 구현을 하고 싶은데 도저히 찾을 수 가 없네요 고수님들 조언 좀 부탁드립니다~~ㅠㅠ

 

hunter00243 (120 포인트) 님이 2014년 11월 17일 질문
hunter00243님이 2014년 11월 18일 수정
뒤늦은 답변이지만

TYPE_STATUS_BAR_OVERLAY

가 해결해줍니다.

2개의 답변

0 추천
해결 하셨나요?? 저도 여기서 막혀서 진행을 못하고 있어요ㅠ
힝힝 님이 2016년 2월 3일 답변
0 추천
뒤늦은 답변이지만

TYPE_STATUS_BAR_OVERLAY

가 해결해줍니다.
손조지 (180 포인트) 님이 2016년 8월 2일 답변
...