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

백그라운드에서 터치되게 하고싶은데 어떻게 하나요?

0 추천
검색해보니까 백그라운드에서 service로 돌리면서

이미지 같은것을 드래그해서 이동시키는것은 가능하던데

제가 원하는건 화면 어느부분이든 터치하면 그부분에 이미지가 바로 나타나는 것이거든요

여기까진 했습니다!

그런데 제가 터치이벤트자체를 화면전체로 잡다보니까 다른어플이나 바탕화면등에서 터치가 안되요.

제어플도 터치되면서 다른어플도 실행시키는 방법이 없을까요?

제가 생각한거는 터치이벤트가 발생했을 때 핸들러로 타임을 주면서 그 시간동안은 제 백그라운드 view를 gone했습니다.

핸들러 돌아가는시간동안은 다른곳을 터치해도 제어플말고 다른곳에서 터치가 먹습니다....

그치만 이렇게하니까 더블클릭을 해야하더라구요.ㅠㅠ 도와주세요.........

백그라운드로 어딜 클릭해도 제어플의 터치이벤트가 먹으면서 다른어플도 터치되게......

 

소스 첨부합니다.
꿀떡 (2,700 포인트) 님이 2017년 2월 20일 질문
public class AlwaysTopServiceTouch extends Service {
    private View mView;
    private WindowManager mManager;
    private WindowManager.LayoutParams mParams;
    private ImageView iv;

    private float mTouchX, mTouchY;
    private int mViewX, mViewY;

    private boolean isMove = false;

    private OnTouchListener mViewTouchListener = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    isMove = false;
                    initialize();

                    mTouchX = event.getRawX();
                    mTouchY = event.getRawY();
                    mViewX = mParams.x;
                    mViewY = mParams.y;
                    break;

                case MotionEvent.ACTION_UP:

                    int x = (int) (event.getRawX() - mTouchX);
                    int y = (int) (event.getRawY() - mTouchY);

                    mParams.x = mViewX + x;
                    mParams.y = mViewY + y;
                    if (!isMove) {
                        Toast.makeText(getApplicationContext(), "dddd",
                                Toast.LENGTH_SHORT).show();
                        iv.setTranslationX(mTouchX - mViewX);
                        iv.setTranslationY(mTouchY - mViewY);


                        mManager = (WindowManager) getSystemService(WINDOW_SERVICE);
                        mManager.updateViewLayout(mView, mParams);

                        mView.setVisibility(View.GONE);
                    }


                    break;

            }

            return true;
        }
    };

    private void initialize() {


        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
               mView.setVisibility(View.VISIBLE);
            }
        };

        handler.sendEmptyMessageDelayed(0, 500);    // ms, 0.5초후 종료시킴
    }


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

        LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mView = mInflater.inflate(R.layout.always_on_top_view_touch, null);

        iv = (ImageView) mView.findViewById(R.id.iv);

        mView.setOnTouchListener(mViewTouchListener);

        mParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
        mParams.gravity = Gravity.TOP | Gravity.LEFT;

        mManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mManager.addView(mView, mParams);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mView != null) {
            mManager.removeView(mView);
            mView = null;
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...