안 드 로 이 드 는 터치 이동 의 부상 창 을 빠르게 실현 한다.

본 논문 의 사례 는 안 드 로 이 드 가 터치 이동 을 실현 하 는 부상 창의 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
1.움 직 이 는 플 로 팅 창의 빠 른 구현 UI 터치

2.부상 창 실현
2.1 부상 창 권한
게 으 름 을 피 우기 위해 SDK 는 비교적 낮은 17 을 선택 합 니 다.권한 을 설정 하지 않 으 면 응용 프로그램 이 실 행 됩 니 다.
정규 프로 세 스,부상 창 권한 이 있 는 지 확인 합 니 다.알림 이 필요 하지 않 으 면 부상 창 설정 인터페이스 로 이동 합 니 다."즉,다른 응용 프로그램 에서 실행 할 수 있 는 지 여부"

<uses-sdk
  android:minSdkVersion="17"
  android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2.2 부상 창 설정 초기 화
여 기 는 주로 mParams.type 과 mParams.flags 라 는 두 매개 변 수 를 주목 합 니 다.우 리 는 View 를 사용 하여 레이아웃 을 불 러 올 수 있 습 니 다.부상 창 인터페이스 에 중심 을 두 기 위해 저 는 TextView 를 직접 사용 하여 프레젠테이션 을 할 수 있 습 니 다.

private void initFloatWindow() {

    if (mShow == null) {
      mWm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

      mShow = new TextView(this);
      mShow.setText("I Love You");
      mShow.setTextColor(Color.RED);
      mShow.setTextSize(50);

      mShow.setOnTouchListener(new View.OnTouchListener() {
        int lastX = 0;
        int lastY = 0;
        int paramX = 0;
        int paramY = 0;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
          switch (motionEvent.getAction()) {
          case MotionEvent.ACTION_DOWN:
            lastX = (int) motionEvent.getRawX();
            lastY = (int) motionEvent.getRawY();
            paramX = mParams.x;
            paramY = mParams.y;
            break;
          case MotionEvent.ACTION_MOVE:
            int dx = (int) motionEvent.getRawX() - lastX;
            int dy = (int) motionEvent.getRawY() - lastY;
            mParams.x = paramX + dx;
            mParams.y = paramY + dy;
            mWm.updateViewLayout(mShow, mParams);
            break;
          }
          return true;
        }
      });

      mParams = new WindowManager.LayoutParams();
      mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
      mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
      mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
      //             
      mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
      mParams.format = PixelFormat.TRANSPARENT;

    }
  }
2.3 부상 창 표시

mWm.addView(mShow, mParams);
2.4 부상 창 숨 기기

mWm.removeView(mShow);
2.5 전체 예제 코드

package com.wu.sufadi;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

public class MainActivity extends Activity {

  private TextView mShow;

  private WindowManager mWm;
  private WindowManager.LayoutParams mParams;
  private static final int MSG_SHOW_WINDOW = 1;
  private static final int MSG_HIDE_WINDOW = 2;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initFloatWindow();
  }

  public void click_show(View view) {
    showFloatWindow();
  }

  public void click_hide(View view) {
    hideFloatWindow();
  }

  Handler handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      switch (msg.what) {
      case MSG_SHOW_WINDOW:
        mWm.addView(mShow, mParams);
        break;
      case MSG_HIDE_WINDOW:
        mWm.removeView(mShow);
        break;
      default:
        break;
      }
    }
  };

  private void showFloatWindow() {
    handler.sendEmptyMessage(MSG_SHOW_WINDOW);
  }

  private void hideFloatWindow() {
    handler.sendEmptyMessage(MSG_HIDE_WINDOW);
  }

  private void initFloatWindow() {

    if (mShow == null) {
      mWm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

      mShow = new TextView(this);
      mShow.setText("I Love You");
      mShow.setTextColor(Color.RED);
      mShow.setTextSize(50);

      mShow.setOnTouchListener(new View.OnTouchListener() {
        int lastX = 0;
        int lastY = 0;
        int paramX = 0;
        int paramY = 0;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
          switch (motionEvent.getAction()) {
          case MotionEvent.ACTION_DOWN:
            lastX = (int) motionEvent.getRawX();
            lastY = (int) motionEvent.getRawY();
            paramX = mParams.x;
            paramY = mParams.y;
            break;
          case MotionEvent.ACTION_MOVE:
            int dx = (int) motionEvent.getRawX() - lastX;
            int dy = (int) motionEvent.getRawY() - lastY;
            mParams.x = paramX + dx;
            mParams.y = paramY + dy;
            mWm.updateViewLayout(mShow, mParams);
            break;
          }
          return true;
        }
      });

      mParams = new WindowManager.LayoutParams();
      mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
      mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
      mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
      //             
      mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
      mParams.format = PixelFormat.TRANSPARENT;

    }
  }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기