안 드 로 이 드 데스크 톱 이동 부상 창 구현

현재 많은 응용 프로그램 들 이 이러한 기능 을 가지 고 있다.예 를 들 어 360 등 안전 위 사,핸드폰 관리자 안의 응용 이다.
효과 그림:

1.원리 와 이동 사고 실현
Window Manager 를 호출 하고 Window Manager.LayoutParams 의 관련 속성 을 설정 합 니 다.Window Manager 의 addView 방법 으로 View 를 만 듭 니 다.이렇게 생 긴 View 는 Window Manager.LayoutParams 속성 에 따라 효과 도 다 릅 니 다.예 를 들 어 시스템 최상 위 창 을 만 들 고 부상 창 효 과 를 실현 합 니 다!그리고 플 로 팅 View 의 onTouchEvent 방법 을 덮어 써 서 window Mananager.LayoutParams 의 x 와 y 값 을 바 꾸 어 플 로 팅 창 을 자 유 롭 게 이동 합 니 다.
2.예시 코드
부유 View 코드 부터 볼 게 요.

package com.example.suspend;
 
import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;
 
public class MyFloatView extends ImageView {
 private float mTouchStartX;
 private float mTouchStartY;
 private float x;
 private float y;
 
 private WindowManager wm = (WindowManager) getContext()
  .getApplicationContext().getSystemService("window");
 //  wmParams          ,           
 private WindowManager.LayoutParams wmParams = ((MyApplication) getContext()
  .getApplicationContext()).getMywmParams();
 
 public MyFloatView(Context context) {
 super(context);
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 // TODO Auto-generated method stub
 //          ,          
 x = event.getRawX();
 y = event.getRawY() - 25; // 25         
 Log.i("currP", "currX" + x + "====currY" + y);
 
 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN: //           
  //     View   ,   View      
  mTouchStartX = event.getX();
  mTouchStartY = event.getY();
  Log.i("startP", "startX" + mTouchStartX + "====startY"
   + mTouchStartY);
  break;
 case MotionEvent.ACTION_MOVE://                
  updateViewPosition(); 
  break;
 case MotionEvent.ACTION_UP://           
  updateViewPosition(); 
  mTouchStartX=mTouchStartY=0; 
  break;
 default:
  break;
 }
 return true;
 }
 
 private void updateViewPosition() {
 //           
 wmParams.x = (int)(x - mTouchStartX);
 wmParams.y = (int)(y - mTouchStartY);
 wm.updateViewLayout(this, wmParams);//      
 }
}

위의 wmParams 변수(즉 WindowManager.LayoutParams)의 저장 소 는 extends Application 방식 으로 전역 변 수 를 만 듭 니 다.
예제 코드 는 다음 과 같다.

package com.example.suspend;
 
import android.app.Application;
import android.view.WindowManager;
 
public class MyApplication extends Application {
 private WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
 
 @Override
 public void onCreate() {
 // TODO Auto-generated method stub
 super.onCreate();
 }
 
 public WindowManager.LayoutParams getMywmParams() {
 return wmParams;
 
 }
 
}
Activity 의 코드 를 살 펴 보 겠 습 니 다.

package com.example.suspend;
 
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
 
public class MainActivity extends Activity {
 private WindowManager wm;
 private WindowManager.LayoutParams wmParams;
 private MyFloatView myFV;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 //       
 createFloatView();
 }
 
 private void createFloatView() {
 myFV = new MyFloatView(getApplicationContext());
 myFV.setImageResource(R.drawable.ic_launcher);
 //   WindowManager
 wm = (WindowManager) getApplicationContext().getSystemService("window");
 //   LayoutParams(    )    
 wmParams = ((MyApplication) getApplication()).getMywmParams();
 
 wmParams.type = LayoutParams.TYPE_PHONE;//   window type
 wmParams.format = PixelFormat.RGBA_8888;//       ,       
 //   Window flag
 wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
  | LayoutParams.FLAG_NOT_FOCUSABLE;
 /*
  * 
  *    flags       “  ”。
  * 
  *        ,       ,            。
  * 
  * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
  * 
  * | LayoutParams.FLAG_NOT_FOCUSABLE
  * 
  * | LayoutParams.FLAG_NOT_TOUCHABLE;
  */
 wmParams.gravity = Gravity.LEFT | Gravity.TOP;//           ,      
 //          ,  x、y   
 wmParams.x = 0;
 wmParams.y = 0;
 //           
 wmParams.width = 40;
 wmParams.height = 40;
 //   myFloatView  
 wm.addView(myFV, wmParams);
 }
 
 @Override
 protected void onDestroy() {
 // TODO Auto-generated method stub
 super.onDestroy();
 //      (Activity  )       
 wm.removeView(myFV);
 }
}
마지막 으로 AndroidManifest.xml 에 권한 을 추가 하 는 것 을 잊 지 마 세 요:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기