안 드 로 이 드 360 가속 구 메모리 방출 실현

현재 핸드폰 의 부상 창 응용 이 점점 많아 지고 있다.사용자 에 게 가장 흔히 볼 수 있 는 부상 창 응용 은 바로 안전 소프트웨어 의 부상 컨트롤 이다.360 위 사 에 게 부상 창 을 열 때 작은 공 이 고 작은 공 은 끌 수 있 으 며 작은 공 을 클릭 하면 큰 창문 컨트롤 이 나타 나 면 진일보 한 조작 을 할 수 있다.예 를 들 어 핸드폰 메모리 방출 등 이다.그래서 모 과 망 의 영상 을 빌려 360 가속 구 를 모방 하여 작은 공 을 클릭 하여 메모 리 를 방출 하 는 기능 을 추가 했다.
핸드폰 은 주파수 캡 처 만 있 기 때문에 다음 그림 과 같다.오픈 단 추 를 누 르 면 현탁 창 작은 공 컨트롤 에 핸드폰 의 사용 가능 한 메모리 백분율 을 표시 합 니 다.작은 공 을 끌 때 작은 공 은 Android 아이콘 으로 변 합 니 다.작은 공 을 풀 고 작은 공 은 주파수 막 양쪽 에 붙 어 있다.작은 공 을 클릭 하면 핸드폰 밑 에 큰 창 컨트롤 이 나타 나 고 안의 작은 공 을 클릭 하여 핸드폰 메모리 의 방출 을 한다.휴대 전화 화면의 다른 구역 을 클릭 하면 큰 창문 이 사라 지고 작은 공이 다시 나타난다.
효 과 는 다음 과 같 습 니 다:

다음은 실현 의 중요 한 절차 이다.
1.Float CircleView 의 실현(사용자 정의 view)
Float Circle View 를 실현 하 는 과정 은 사용자 정의 view 의 과정 입 니 다.1.사용자 정의 View 의 속성 2.View 의 구조 방법 에서 사용자 정의 속성 3 을 얻 고 onMesure 4 를 다시 쓰 며 onDraw 를 다시 씁 니 다.우 리 는 다른 속성 을 사용자 정의 하지 않 아서 많은 절 차 를 절약 했다.
각종 변수의 초기 화,작은 공 을 끌 때 표시 할 아이콘 을 설정 하고,각종 메모 리 를 계 산 했 습 니 다.(작은 공 에 보이 기)
 

 public int width=100;
  public int heigth=100;
  private Paint circlePaint;//  
  private Paint textPaint; //  
  private float availMemory; //    
  private float totalMemory; //   
  private String text;  //          
  private boolean isDraging=false; //       。
  private Bitmap src;
  private Bitmap scaledBitmap; //      。
 /**
   *              ,   ,        。
   */
  public void initPatints() {
    circlePaint = new Paint();
    circlePaint.setColor(Color.CYAN);
    circlePaint.setAntiAlias(true);
    textPaint = new Paint();
    textPaint.setColor(Color.WHITE);
    textPaint.setTextSize(25);
    textPaint.setFakeBoldText(true);
    textPaint.setAntiAlias(true);
    //    
    src = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
    //      (               。)
    scaledBitmap = Bitmap.createScaledBitmap(src, width, heigth, true);
    //      ,   ,       ,
    availMemory= (float) getAvailMemory(getContext());
    totalMemory= (float) getTotalMemory(getContext());
    text=(int)((availMemory/totalMemory)*100)+"%";
  }
onMeasure();고정 적 인 너비 와 높이 를 set Measured Dimension(width,heigth)을 통 해 죽 이 는 것 입 니 다.전래
onDraw();플 로 팅 볼 그리 기.boolean 변 수 를 정의 하여 현재 상태 가 작은 공 을 끌 어 당 기 는 상태 인지 판단 합 니 다.작은 공 을 끌 어 당 기 는 상태 라면 이 위치 에 안 드 로 이 드 아이콘 을 그립 니 다.드래그 상태 가 아니라면 작은 공 을 그립 니 다.작은 공 을 그 리 는 데 는 난이도 가 없고,관건 은 글 씨 를 그 리 는 것 이다.아래 의 두 그림 은 글 자 를 그 릴 때의 이 해 를 깊이 있 게 할 수 있다.

1.글 자 를 그 릴 때의 x 좌표(1.textPaint.measureText(text);글자 의 너비 얻 기 2.작은 공의 너비/2-글자 의 너비/2.)
2.글 자 를 그 릴 때의 y 좌표(1.Paint.FontMetrics fontMetrics=textPaint.getFontMetrics();글꼴 속성 측정 류 를 가 져 옵 니 다.2.(fontMetrics.ascent+fontMetrics.descent)/2 글자 의 높이 를 얻는다.3.작은 공의 높이/2-글씨체 의 높이/2)
그림 을 그리 면 이해 하기 쉽다.

/**
   *       。             android  ,             。
   * @param canvas
   */
  @Override
  protected void onDraw(Canvas canvas) {
    if (isDraging){
      canvas.drawBitmap(scaledBitmap,0,0,null);
    }else {
      //1.  
      canvas.drawCircle(width / 2, heigth / 2, width / 2, circlePaint);
      //2. text
      float textwidth = textPaint.measureText(text);//    
      float x = width / 2 - textwidth / 2;
      Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();

      float dy = -(fontMetrics.ascent + fontMetrics.descent) / 2;
      float y = heigth / 2 + dy;
      canvas.drawText(text, x, y, textPaint);
    }



  }

핸드폰 에 사 용 된 메모리 와 총 메모 리 를 가 져 오 는 방법:
   

public long getAvailMemory(Context context)
  {
    //   android        
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
    am.getMemoryInfo(mi);
    //mi.availMem;          
    //return Formatter.formatFileSize(context, mi.availMem);//            

    return mi.availMem/(1024*1024);
  }
  public long getTotalMemory(Context context)
  {
    String str1 = "/proc/meminfo";//         
    String str2;
    String[] arrayOfString;
    long initial_memory = 0;
    try
    {
      FileReader localFileReader = new FileReader(str1);
      BufferedReader localBufferedReader = new BufferedReader(
          localFileReader, 8192);
      str2 = localBufferedReader.readLine();//   meminfo   ,       
      arrayOfString = str2.split("\\s+");
      for (String num : arrayOfString) {
        Log.i(str2, num + "\t");
      }
      initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;//        ,   KB,  1024   Byte
      localBufferedReader.close();
    } catch (IOException e) {
    }
    //return Formatter.formatFileSize(context, initial_memory);// Byte   KB  MB,       

    return initial_memory/(1024*1024);
  }

2.Window Manager 창 관리 류 를 만 들 고 현탁 구 와 아래쪽 큰 창 을 관리 합 니 다.
Window Manager 클래스.전체 부유 공 과 휴대 전화 밑 에 있 는 큰 창문 의 표시 와 숨 김 을 관리 하 는 데 사용 된다.
Manifest 파일 에권한 입 니 다.
WindowManager wm=(WindowManager)getSystem Service(Context.WINDOWSERVICE);창 관리 클래스 가 져 오기;
wm.addView(view,params)를 이용 하기;view 를 창 에 추가 합 니 다.
wm.remove(view,params)를 이용 하기;view 를 창 에서 제거 합 니 다.
wm.updateViewLayout(view,params)를 이용 합 니 다.view 를 업데이트 합 니 다.
Window Manager.LayoutParams 는 view 의 다양한 속성 을 설정 합 니 다.
1.FloatViewManager 인 스 턴 스 를 만 듭 니 다.

//      
 public static FloatViewManager getInstance(Context context){
    if (inStance==null){
      synchronized(FloatViewManager.class){
        if (inStance==null){
          inStance=new FloatViewManager(context);
        }
      }
    }
    return inStance;
  }
2.작은 공 을 띄 우 고 아래쪽 창 을 보 여 주 는 방법.(창 을 보 여 주 는 방법 은 부유 구 를 보 여 주 는 것 과 유사 하 다.)

/**
   *     
   */
  public void showFloatCircleView(){
  //    
    if (params==null){
      params = new WindowManager.LayoutParams();
      //  
      params.width=circleView.width;
      params.height=circleView.heigth;
      //    
      params.gravity= Gravity.TOP|Gravity.LEFT;
      //   
      params.x=0;
      params.y=0;
      //  
      params.type=WindowManager.LayoutParams.TYPE_TOAST;
      //   window  。
      params.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
      //    
      params.format= PixelFormat.RGBA_8888;
    }
    //        。
    wm.addView(circleView, params);
  }

 public void showFloatCircleView(){
 ......
 }

 3.프로그램 을 시작 하면 먼저 플 로 팅 볼 을 만 들 고 작은 공 은 끌 어 당 길 수 있 으 며 작은 공 을 클릭 하면 핸드폰 밑 에 있 는 창 표시(FloatMenuView),작은 공 은 숨 길 수 있 습 니 다.따라서 작은 공(circle View)에 대해 서 는 setOnTouch Listener 와 setOnClickListener 사건 을 감청 해 야 합 니 다.
작은 공의 사건 배포 분석 하기;작은 공 에 대해:
ACTION다운 시,작은 공 을 기록 한 다운 X,다운 Y,그리고 startX,startY,
ACTIONMOVE 에 서 는 circle View 가 끌 리 는 상 태 를 true 로 설정 하고 작은 공의 moveX,moveY 를 기록 하 며 작은 공의 이동 거리(dx,dy)를 계산 한 다음 wm.updateViewLayout(circle View,params)에 따라작은 공의 위 치 를 갱신 하 다.마지막 으로 마지막 move 의 좌 표를 startX,startY 에 할당 합 니 다.
ACTIONUP 시 circle View 를 false 로 끌 어 올 릴 지 여 부 를 기록 합 니 다.들 어 올 릴 때의 좌표,upx 는 upx 와 핸드폰 화면 너비/2 에 따라 최종 작은 공이 화면 왼쪽 에 붙 었 는 지 오른쪽 에 붙 었 는 지 판단 합 니 다.뒤쪽 이 작은 공 을 끌 어 당 기 는 오차.작은 공이 끌 어 당 기 는 거리 가 10 픽 셀 보다 작 을 때 작은 공의 클릭 이 벤트 를 촉발 할 수 있 습 니 다.(작은 공의 터치 이 벤트 는 작은 공의 클릭 이벤트 보다 우선 합 니 다.터치 이벤트 가 트 루 로 돌아 갈 때 이 이 벤트 는 소비 되 어 이 벤트 를 아래로 전달 하지 않 습 니 다.Touch 이벤트 가 false 로 돌아 갈 때 이 이 벤트 는 계속 아래로 전달 되 어 작은 공의 클릭 이 벤트 를 촉발 합 니 다.)
작은 공의 클릭 이벤트:작은 공 을 클릭 하고 작은 공 을 띄 워 숨 기 며 핸드폰 밑 에 창문 이 나타 납 니 다.아래쪽 창 이 나타 날 때의 과도 애니메이션 을 설정 합 니 다.

// circleView  touch  。
  private View.OnTouchListener circleViewOnTouchListener=new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
        //        ,  ACTION_MOVE  。
          startX = event.getRawX();
          startY = event.getRawY();
          //      。
          downX = event.getRawX();
          downY = event.getRawY();
          break;
        case MotionEvent.ACTION_MOVE:
          circleView.setDrageState(true);
           moveX = event.getRawX();
           moveY=event.getRawY();
          float dx = moveX -startX;
          float dy=moveY-startY;
          params.x+=dx;
          params.y+=dy;
          wm.updateViewLayout(circleView,params);
          startX= moveX;
          startY=moveY;
          break;
        case MotionEvent.ACTION_UP:
          float upx=event.getRawX();
          if (upx>getScreenWidth()/2){
            params.x=getScreenWidth()-circleView.width;
          }else {
            params.x=0;
          }
          circleView.setDrageState(false);
          wm.updateViewLayout(circleView,params);
          if (Math.abs(moveX-downX)>10){
            return true;
          }else {
            return false;
          }
        default:
          break;
      }
      return false;
    }
  };
circleView.setOnTouchListener(circleViewOnTouchListener);
    circleView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //Toast.makeText(, "onclick", Toast.LENGTH_SHORT).show();
        //[ circleView,@    。
        wm.removeView(circleView);
        showFloatMenuView();
        floatMenuView.startAnimation();
      }
    });
3.MyProgreeView.
1.붓 을 초기 화하 고 view 를 손짓 으로 감청 한다.클릭 과 이 벤트 를 더 블 클릭 합 니 다.(클릭 할 수 있 는 view 를 설정 해 야 합 니 다)

private void initPaint() {
    //    
    circlepaint = new Paint();
    circlepaint.setColor(Color.argb(0xff, 0x3a, 0x8c, 0x6c));
    circlepaint.setAntiAlias(true);
    //      
    progerssPaint = new Paint();
    progerssPaint.setAntiAlias(true);
    progerssPaint.setColor(Color.argb(0xff, 0x4e, 0xcc, 0x66));
    progerssPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//      
    //     
    textPaint = new Paint();
    textPaint.setAntiAlias(true);
    textPaint.setColor(Color.WHITE);
    textPaint.setTextSize(25);

    //  
    bitmap = Bitmap.createBitmap(width, heigth, Bitmap.Config.ARGB_8888);
    bitmapCanvas = new Canvas(bitmap);
    //    。
    gestureDetector = new GestureDetector(new MyGertureDetectorListener());
    setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
      }
    });
    //  view    。
    setClickable(true);
  }
  class MyGertureDetectorListener extends GestureDetector.SimpleOnGestureListener{
    @Override
    public boolean onDoubleTap(MotionEvent e) {
    ......
     //       
      return super.onDoubleTap(e);
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
    ......
     //       
      return super.onSingleTapConfirmed(e);
    }
  }

2.handler 상호작용 으로 클릭 과 더 블 클릭 이벤트 의 상태 업 데 이 트 를 진행 합 니 다.클릭 시 베 세 르 곡선 을 이용 하여 파문 출 렁 이 는 효 과 를 실현 합 니 다.더 블 클릭 시 파문 이 계속 떨 어 지고 메모리 방출 을 진행 하 며 마지막 으로 메모리 방출 후의 사용 한 메모리 백분율 을 표시 합 니 다.handler 는 주기 적 인 메 시 지 를 보 내 이벤트 와 더 블 클릭 이벤트 의 작은 공 을 계속 다시 그립 니 다.(다음 소절 에 다시 그리다.

//        handler.
private void startSingleTapAnimation() {
    handler.postDelayed(singleTapRunnable,200); 
  }
  private SingleTapRunnable singleTapRunnable=new SingleTapRunnable();
  class SingleTapRunnable implements Runnable{
    @Override
    public void run() {
      count--;
      if (count>=0) {
        invalidate();//      。
        handler.postDelayed(singleTapRunnable,200);
      }else {
        handler.removeCallbacks(singleTapRunnable);
        count=50;
      }
    }
  }
  //        handler。
  private void startDoubleTapAnimation() {
    handler.postDelayed(runnbale,50);
  }
  private DoubleTapRunnable runnbale=new DoubleTapRunnable();

  class DoubleTapRunnable implements Runnable{
    @Override
    public void run() {
      num--;
      if (num>=0){
        invalidate();//      。
        handler.postDelayed(runnbale,50);
      }else {
        handler.removeCallbacks(runnbale);
        //    。
       killprocess();
       //             。
        num=(int)(((float)currentProgress/max)*100);
      }
    }
  }

3.이벤트 와 이 벤트 를 두 번 눌 러 서 다시 그립 니 다.

        ,        。
//    
    bitmapCanvas.drawCircle(width / 2, heigth / 2, width / 2, circlepaint);
    //  path,      。         path,reset.
    path.reset();
    float y =(1-(float)num/100)*heigth;
    path.moveTo(width, y);
    path.lineTo(width, heigth);
    path.lineTo(0, heigth);
    path.lineTo(0, y);
이 어 베 세 르 곡선 을 이용 해 파문 경 로 를 그 렸 다.
안 드 로 이 드-베 세 르 곡선
베 세 르 곡선 이 안 드 로 이 드 에서 의 응용
여기 베 세 르 곡선 에 대한 상세 한 설명 이 있 습 니 다.사실 깊이 이해 할 필요 가 없다.그것 으로 물결 무늬 효 과 를 실현 할 수 있다 는 것 만 알 면 된다.주로 path.rQuadto(x1,y1,x2,y2)를 이용 합 니 다.종점(x2,y2),보조 제어점(x1,y1)의 베 세 르 곡선.따라서 y1 의 위 치 를 계속 바 꾸 면 우 리 는 물결 무늬 의 효 과 를 그 릴 수 있다.
우선 더 블 클릭 이벤트 인지 여 부 를 판단 합 니 다.
더 블 클릭:변 수 를 설정 하면 d 의 값(d 의 값 변 화 는 num 에 의 해 발생 하고 num 실제 handler 에서 계속 줄 어 듭 니 다.numC;),베 어 셀 곡선 을 그립 니 다.물결 무늬 의 하강 효 과 를 실현 하 다.
누 르 면:count 값 을 설정 하고 count 값 을 계속 변경 합 니 다(count 값 의 변 화 는 handler 에서 이 루어 집 니 다.countC;),먼저 count 가 2 로 나 눌 수 있 는 지 판단 하고 이 두 개의 베 세 르 곡선 을 교체 해서 그립 니 다.(이 두 개의 베 세 르 곡선 은 정반 대 이다).이로써 물결 이 출 렁 이 는 효 과 를 실현 한다.
(for 순환 은 물결 을 실현 하 는 파수 이 고 path.rQuadto()한 쌍 입 니 다.한 번 의 파문 만 이 루어 질 수 있다.스스로 검증 할 수 있다)

 if (!isSingleTap){
    float d=(1-(float)num/(100/2))*10;
      for (int i=0;i<3;i++){
      path.rQuadTo(10,-d,20,0);
      path.rQuadTo(10,d,20,0);
       }
    }else {
      float d=(float)count/50*10;
      if (count%2==0){
        for (int i=0;i<=3;i++){
          path.rQuadTo(10,-d,30,0);
          path.rQuadTo(10,d,30,0);
        }
      }else {
        for (int i=0;i<=3;i++){
          path.rQuadTo(10,d,30,0);
          path.rQuadTo(10,-d,30,0);
        }

      }
    }

마지막 으로 메모리 방출 방법 입 니 다.Manifest 파일 에권한.
 

public void killprocess(){
    ActivityManager activityManger=(ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> list=activityManger.getRunningAppProcesses();
    if(list!=null)
      for(int i=0;i<list.size();i++)
      {
        ActivityManager.RunningAppProcessInfo apinfo=list.get(i);
        String[] pkgList=apinfo.pkgList;
 if(apinfo.importance>ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE)
        {
          // Process.killProcess(apinfo.pid);
          for(int j=0;j<pkgList.length;j++) {
            boolean flag=pkgList[j].contains("com.example.yyh.animation360");//            ,             。
            if(!flag){
            activityManger.killBackgroundProcesses(pkgList[j]);
          }
          }
        }
      }
4.Float Menu View 의 실현.
1.float 만 들 기menuview.xml;ImageView+TextView+사용자 정의 MyProgreeView 가 포함 되 어 있 습 니 다.
아래쪽 창 을 클릭 할 수 있 도록 설정 해 야 합 니 다.android:clickable="true";

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#33000000"
  >
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="#F02F3942"
    android:layout_alignParentBottom="true"
    android:id="@+id/ll"
    android:clickable="true"
    >
    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
      >
      <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@mipmap/ic_launcher"
        android:layout_gravity="center_vertical"
        />
      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:textColor="#c93944"
        android:text="360   "
        android:layout_gravity="center_vertical"
        />
    </LinearLayout>
    <com.example.yyh.animation360.view.MyProgreeView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center_horizontal"
      android:layout_marginTop="10dp"
      />
  </LinearLayout>
</RelativeLayout>
2.FloatMenuView 를 조건 에 따라 이용 하기(wm.addView(view,params);view 를 창 에 추가 합 니 다.
wm.remove(view,params)를 이용 하기;view 를 창 에서 제거 합 니 다.)방법,아래쪽 창 view 의 표시 와 숨 기기
TranslateAnimation 클래스 는 아래쪽 창 이 들 어 갈 때의 애니메이션 효 과 를 설정 합 니 다.TranslateAnimation(int fromXType,float fromXValue,int toXType,float toXValue,int fromYType,float fromYValue,int toYType,float toYValue)
int from XType:x 축 방향 에서 시작 하 는 참조 값 은 세 가지 옵션 이 있 습 니 다.(1.Animation.ABSOLUTE:구체 적 인 좌표 값 은 절대적 인 화면 픽 셀 단 위 를 가리킨다.
2.Animation.RELATIVE_TO_SELF:자신의 좌표 값 에 상대 합 니 다.3.Animation.RELATIVE_TO_PARENT:부모 용기 에 대한 좌표 값 입 니 다.)
float from Xvalue 두 번 째 매개 변 수 는 첫 번 째 매개 변수 형식의 시작 값 입 니 다(예 를 들 어 첫 번 째 매개 변 수 는 Animation.RELATIVE 로 설정 되 어 있 습 니 다.TO_SELF,두 번 째 매개 변 수 는 0.1f 로 자신의 좌표 값 에 0.1 을 곱 하 는 것 을 나타 낸다.
int toXType:x 축 방향 종점 의 참조 값 은 세 개의 옵션 이 첫 번 째 매개 변수 와 같 습 니 다.
float toValue:네 번 째 매개 변 수 는 세 번 째 매개 변수 형식의 시작 값 입 니 다.
Y 축 방향의 매개 변 수 는 같 습 니 다.시작+끝 점;(매개 매개 변수 뒤의 매개 변 수 는 이전 매개 변수의 시작 값 입 니 다.)
그리고 이 view 에 OnTouch Listener 를 설정 합 니 다.OnTouch 사건 은 마지막 으로 false 로 돌아 가 야 합 니 다.이 사건 은 여전히 아래로 전달 되 어야 한 다 는 뜻 입 니 다.따라서 핸드폰 의 다른 구역 을 클릭 할 때 핸드폰 밑 에 있 는 창 이 숨 어 있 고 떠 있 는 작은 공 은 바닥 창 을 클릭 할 때 변화 가 없 으 며 바닥 창 에 있 는 작은 공 을 클릭 할 때 클릭 과 더 블 클릭 이 벤트 를 촉발 합 니 다.

 View view =View.inflate(getContext(), R.layout.float_menuview,null);
    LinearLayout linearLayout= (LinearLayout) view.findViewById(R.id.ll);
    translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF,0);
    translateAnimation.setDuration(500);
    translateAnimation.setFillAfter(true);
    linearLayout.setAnimation(translateAnimation);
    view.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        FloatViewManager manager=FloatViewManager.getInstance(getContext());
        manager.hideFloatMenuView();
        manager.showFloatCircleView();
        return false;
      }
    });
    addView(view);
5.MyFloatService
Float VIEwManager 를 만 드 는 데 사용 되 며,부유 구+핸드폰 아래쪽 창의 생 성과 제 거 를 관리 합 니 다.

public class MyFloatService extends Service {
  @Nullable
  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
  @Override
  public void onCreate() {
    //    FloatViewManager
    FloatViewManager manager=FloatViewManager.getInstance(this);
    manager.showFloatCircleView();
    super.onCreate();
  }

}

6.MainActivity 의 실현
intent 를 정의 하고 서 비 스 를 시작 합 니 다.(서비스 에서 WindowManager 단일 대상 을 만 들 고 플 로 팅 볼 과 핸드폰 아래쪽 창 을 관리 합 니 다.)현재 activity 를 닫 습 니 다.

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
  public void startService(View view){
    Intent intent=new Intent(this, MyFloatService.class);
    startService(intent);
    finish();
  }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기