안 드 로 이 드 데스크 톱 이동 부상 창 구현
효과 그림:
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" />
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.