Android 부상 구 및 전역 반환 기능 의 실현 예시
앞 은 리 턴 효과,마지막 은 홈 키 구현 효과.
머리말
오래 전부터 부유 구 를 만 들 고 싶 었 습 니 다.프로그램 원숭이 잖 아 요.원 하 는 기능 이 있 을 때 항상 자신 이 시도 해 보고 싶 어서 흥 겹 게 한참 을 찾 았 지만 전체적인 복귀 기능 을 어떻게 실현 해 야 하 는 지 찾 지 못 했 습 니 다!마지막 으로 병 없 이 죽 었 습 니 다.바로 이틀 전에 이 기능 을 생각 했 습 니 다.오늘 은 오 랜 시간 이 걸 렸 습 니 다.같은 소프트웨어 에서 영감 을 얻 었 습 니 다.중요 한 부분 이 제 가 알 아 차 렸 습 니 다.이 생각 에 따라 많은 자 료 를 찾 았 고 전체적인 복귀 기능 을 실 현 했 습 니 다.
사고의 방향
쓸데없는 소리 하지 말고 주요 한 사고방식 을 말 해 봐.관건 적 인 유형 은 바로
AccessibilityService
,공식 문서 주소이런 유형 은 핸드폰 안의 한 기능 과 밀접 한 관 계 를 가진다.보조 기능-서비스.공식 문 서 를 보면 이 기능 은 장애 가 있 는 사람들 이 휴대 전 화 를 더 잘 사용 할 수 있 도록 하기 위 한 것 이다.우 리 는 여기 서 안에 있 는 API 를 소개 하지 않 습 니 다.우리 의 전체 반환 기능 을 실현 하기 위해 서 우 리 는 하나의 함수 만 사용 하면 됩 니 다boolean performGlobalAction (int action),
공식 설명 은 다음 과 같 습 니 다.Performs a global action. Such an action can be performed at any moment regardless of the current application or user location in that application. For example going back, going home, opening recents, etc.
번역 하면:
전역 동작 을 실행 하 다.이 프로그램의 현재 응용 프로그램 이나 사용자 위치 가 어떻든 간 에 언제든지 이 동작 을 수행 할 수 있다.예 를 들 어 HOME 키,BACK 키,퀘 스 트 키 등 을 실행 합 니 다.
그 중에서 들 어 갈 수 있 는 매개 변 수 는 네 가지 가 있 습 니 다.
코드 를 작성 하 다
가장 중요 한 서비스 클래스
우 리 는 위 에서 그 종 류 를 계승 하기 위해 새로운 종 류 를 만들어 야 한다.
public class MyAccessibilityService extends AccessibilityService {
public static final int BACK = 1;
public static final int HOME = 2;
private static final String TAG = "ICE";
@Override
public void onCreate() {
super.onCreate();
// EventBus
EventBus.getDefault().register(this);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) { }
@Override
public void onInterrupt() {}
@Subscribe
public void onReceive(Integer action){
switch (action){
case BACK:
performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
break;
case HOME:
performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
break;
}
}
}
위의onReceive
방법 은 이벤트 버스 의 구독 함 수 를 사용 하 는 것 입 니 다.다른 곳 에서 메 시 지 를 보 낸 후에 우 리 는 받 을 수 있 습 니 다.그리고 후퇴 를 실행 할 지 데스크 톱 으로 돌아 갈 지 판단 할 수 있 습 니 다.그리고 우 리 는 AndroiManifest 에서 우리 의 서 비 스 를 등록 해 야 합 니 다.그러나 이 등록 은 비교적 특수 합 니 다.
우선 가입 권한 선언:
그리고 등록 서비스:
<service
android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibilityservice"/>
</service>
그 중에서 resource 의 내용 을 xml 패키지 에 설명 하려 면 먼저 xml 패 키 지 를 새로 만 듭 니 다.다음 과 같 습 니 다.그리고 accessibility service.xml 파일 을 새로 만 듭 니 다.내용 은 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/start_floatingBall"/>
<!-- -->
안에 많은 속성 을 설정 할 수 있 습 니 다.여기 서 소개 하지 않 겠 습 니 다.관심 이 있 는 것 은 공식 문서 에서 볼 수 있 습 니 다.그때 description 의 표시 효 과 는 다음 과 같 습 니 다.
자,지금까지 Accessibility Service 서비스의 생 성과 등록 을 마 쳤 습 니 다.그 다음 에 Activity 에서 서 비 스 를 시작 하면 됩 니 다
startService(new Intent(this,MyAccessibilityService.class));
EventBus 를 사용 하여 이 벤트 를 전달 하면 되 돌아 갈 수 있 습 니 다EventBus.getDefault().post(MyAccessibilityService.BACK);
그러나 서 비 스 를 열 어야 합 니 다.간단 한 방법 은 Intent 를 직접 호출 하여 설정 인터페이스 로 이동 하 는 것 입 니 다startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
또는 수 동 으로 설정->보조 기능->서비스->자신의 app 을 찾 은 다음 서 비 스 를 시작 하면 됩 니 다.(서로 다른 시스템 에 약간의 차이 가 있 을 수 있 습 니 다.샤 오 미 는 무장 애 안에 있 습 니 다)화면 은 다음 과 같 습 니 다.부유 구 의 간단 한 실현
1.View 를 사용자 정의 하고 부유 구 를 그립 니 다.
public class FloatingView extends View {
public int height = 150;
public int width = 150;
private Paint paint;
public FloatingView(Context context){
super(context);
paint = new Paint();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(height,width);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(getResources().getColor(R.color.state_one));
canvas.drawCircle(width/2,width/2,width/2,paint);
//
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.WHITE);
canvas.drawCircle(width/2,width/2, (float) (width*1.0/4),paint);
}
코드 는 매우 간단 하 다.큰 원 을 그리고 작은 원 을 그 렸 다.다음은 이 view 를 데스크 톱 에 보 여 줍 니 다.
public class ViewManager {
FloatingView floatBall;
WindowManager windowManager;
public static ViewManager manager;
Context context;
private WindowManager.LayoutParams floatBallParams;
private ViewManager(Context context) {
this.context = context;
}
public static ViewManager getInstance(Context context) {
if (manager == null) {
manager = new ViewManager(context);
}
return manager;
}
public void showFloatBall() {
floatBall = new FloatingView(context);
windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
if (floatBallParams == null) {
floatBallParams = new WindowManager.LayoutParams();
floatBallParams.width = floatBall.width;
floatBallParams.height = floatBall.height;
floatBallParams.gravity = Gravity.TOP | Gravity.LEFT;
floatBallParams.type = WindowManager.LayoutParams.TYPE_TOAST;
floatBallParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
floatBallParams.format = PixelFormat.RGBA_8888;
}
windowManager.addView(floatBall, floatBallParams);
floatBall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(MyAccessibilityService.BACK);
Toast.makeText(context, " ", Toast.LENGTH_SHORT).show();
}
});
floatBall.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
EventBus.getDefault().post(MyAccessibilityService.HOME);
Toast.makeText(context, " ", Toast.LENGTH_SHORT).show();
return false;
}
});
}
public int getScreenWidth() {
return windowManager.getDefaultDisplay().getWidth();
}
}
간단하게 보기 위해 서 는 부상 창 을 끌 어 당 기 는 코드 를 붙 이지 않 았 습 니 다.필요 하 다 면 글 끝 에서 원본 코드 를 볼 수 있 습 니 다.위의 코드 는 view 를 window 에 추가 하고 view 에 클릭 이벤트 와 이벤트 에 길 게 누 르 고 Accessibility Service 에 메 시 지 를 전달 하 며 해당 하 는 이 벤트 를 수행 합 니 다.
부유 창 을 표시 하려 면 권한 을 표시 해 야 합 니 다:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
그리고 수 동 으로 권한 을 오픈 합 니 다!그렇지 않 으 면 부상 창 을 표시 할 수 없습니다.마지막 으로 Activity 에서 사용자 정의 부유 창 을 열 면 됩 니 다.
ViewManager.getInstance(MainActivity.this).showFloatBall();
종결 어지금 보면 전체적인 반환 기능 을 실현 하 는 것 은 정말 간단 하 다.그러나 처음에 정말 오래 찾 았 고 어떻게 찾 아 도 이 기능 을 실현 할 수 없 었 다.그래서 다른 부상 창의 코드 를 배 우려 고 했 지만 어 쩔 수 없 었 다.케이스 를 넣 었 고 번역 한 후에 볼 수 없 었 다.그러나 저 는 서 비 스 를 열 어야 부상 창의 기능 을 사용 할 수 있다 는 세부 사항 을 알 게 되 었 습 니 다.그래서 여기 서 시작 하여 전체적인 귀환 을 실현 하 는 방법 을 천천히 찾 았 습 니 다.
원본 주소:https://github.com/CHNicelee/FloatingBall
demo 다운로드 주소:FloatingBall_jb51.rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.