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 키,퀘 스 트 키 등 을 실행 합 니 다.
그 중에서 들 어 갈 수 있 는 매개 변 수 는 네 가지 가 있 습 니 다.
  • GLOBAL_ACTION_BACK
  • GLOBAL_ACTION_HOME
  • GLOBAL_ACTION_NOTIFICATIONS
  • GLOBAL_ACTION_RECENTS
  • 말 그대로 우리 가 기능 을 되 돌려 주 는 데 필요 한 것 은 GLOBAL 입 니 다.ACTION_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
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기