Android 부유 창 효과 구현

6587 단어 Android부유 창문
갑자기 부상 창 에 관심 이 생 겨 서 자 료 를 찾 아 작은 Demo 를 만 들 었 습 니 다.효 과 는 단 추 를 누 르 면 현재 Activity 를 닫 고 부상 창 을 표시 합 니 다.창 을 드래그 하고 두 번 누 르 면 사라 집 니 다.효과 도 는 다음 과 같다.

그것 의 사용 원 리 는 매우 간단 하 다.바로 Window Manager 라 는 관리 류 를 빌려 실현 한 것 이다.
1.우선 AndroidManifest.xml 에 사용 권한 을 추가 합 니 다.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2.부상 창 레이아웃 구현

public class DesktopLayout extends LinearLayout {

 public DesktopLayout(Context context) {
  super(context);
  setOrientation(LinearLayout.VERTICAL);//     
  

  //    
  this.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT,
    LayoutParams.WRAP_CONTENT));
  
  View view = LayoutInflater.from(context).inflate( 
    R.layout.desklayout, null); 
  this.addView(view);
 }
3.activity 에 표시 합 니 다.

//       
 mWindowManager = (WindowManager) getApplicationContext()
    .getSystemService("window");

//        
 mLayout = new WindowManager.LayoutParams();

//         ――TYPE_SYSTEM_ALERT(    )
 mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

//          :
// FLAG_NOT_FOCUSABLE(          )
 mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

//        
  mLayout.format = PixelFormat.RGBA_8888;

//        
  mLayout.gravity = Gravity.TOP | Gravity.LEFT;

//          
  mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT;
  mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;
자세 한 MainActivity 코드 는 다음 과 같 습 니 다.

package com.yc.yc_suspendingform;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;
import com.yc.yc_floatingform.R;

public class MainActivity extends Activity {
 private WindowManager mWindowManager;
 private WindowManager.LayoutParams mLayout;
 private DesktopLayout mDesktopLayout;
 private long startTime;
 //        
 float x, y;
 int top;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);  
  createWindowManager();
  createDesktopLayout();
  Button btn = (Button) findViewById(R.id.btn);
  btn.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    showDesk();
   }
  });
 }
 /**
  *       
  */
 private void createDesktopLayout() {
  mDesktopLayout = new DesktopLayout(this);
  mDesktopLayout.setOnTouchListener(new OnTouchListener() {
   float mTouchStartX;
   float mTouchStartY;

   @Override
   public boolean onTouch(View v, MotionEvent event) {
    //          ,          
    x = event.getRawX();
    y = event.getRawY() - top; // 25         
    Log.i("startP", "startX" + mTouchStartX + "====startY"
      + mTouchStartY);
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
     //     View   ,   View      
     mTouchStartX = event.getX();
     mTouchStartY = event.getY();
     Log.i("startP", "startX" + mTouchStartX + "====startY"
       + mTouchStartY);
     long end = System.currentTimeMillis() - startTime;
     //        300ms  
     if (end < 300) {
      closeDesk();
     }
     startTime = System.currentTimeMillis();
     break;
    case MotionEvent.ACTION_MOVE:
     //           
     mLayout.x = (int) (x - mTouchStartX);
     mLayout.y = (int) (y - mTouchStartY);
     mWindowManager.updateViewLayout(v, mLayout);
     break;
    case MotionEvent.ACTION_UP:

     //           
     mLayout.x = (int) (x - mTouchStartX);
     mLayout.y = (int) (y - mTouchStartY);
     mWindowManager.updateViewLayout(v, mLayout);

     //              

     mTouchStartX = mTouchStartY = 0;
     break;
    }
    return true;
   }
  });
 }

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  Rect rect = new Rect();
  // /        ,  ,          ,             ,     
  getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
  top = rect.top;//      ,  rect.height,rect.width           

  Log.i("top",""+top);
 }

 /**
  *   DesktopLayout
  */
 private void showDesk() {
  mWindowManager.addView(mDesktopLayout, mLayout);
  finish();
 }

 /**
  *   DesktopLayout
  */
 private void closeDesk() {
  mWindowManager.removeView(mDesktopLayout);
  finish();
 }

 /**
  *   WindowManager
  */
 private void createWindowManager() {
  //       
  mWindowManager = (WindowManager) getApplicationContext()
    .getSystemService("window");

  //        
  mLayout = new WindowManager.LayoutParams();

  //         ――TYPE_SYSTEM_ALERT(    )
  mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

  //          :
  // FLAG_NOT_FOCUSABLE(          )
  mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

  //        
  mLayout.format = PixelFormat.RGBA_8888;

  //        
  mLayout.gravity = Gravity.TOP | Gravity.LEFT;

  //          
  mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT;
  mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;

 }

}
 소스 코드 주소:Android 부유 창 효과 구현
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기