Android 사용자 정의 Toast WindowManager

본 고 는 안 드 로 이 드 사용자 정의 Toast 의 Window Manager 를 공유 하 였 으 며,참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
Toast:WindowManager
세 가지 중요 한 API:
  • public void addView(View view, ViewGroup.LayoutParams params);
  • public void updateViewLayout(View view, ViewGroup.LayoutParams params);
  • 레이아웃 파일 의 속성 에 해당 합 니 다.
  • public void removeView(View view);
  • 반드시 소각 해 야 합 니 다.그렇지 않 으 면 프로그램 을 종료 할 수 없습니다.반드시 제거 해 야 한다.그렇지 않 으 면 이상 을 보고 해 야 한다.
    Toast:WindowManager
  • Toast:setView
  • 사용자 정의 Toast:WindowManager 절차
    1)WindowManager 대상 가 져 오기
    2)WindowManager.LayoutParams 생 성(매개 변수 설정)
    3)뷰 생 성
    4)표시:addView(view,mParams);
    5)숨 기기:removeView(view);
    6)업데이트 위치 1:view:OnTouch Listener:ACTION 설정DONW,ACTION_MOVE,ACTION_UP
    7)업데이트 위치 2:updateViewLayout(view,mParams)
    8)AddressToast 로 작성

    레이아웃 파일
    
     <TextView 
        android:id="@+id/tv_custom_toast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="    "
        android:drawableLeft="@drawable/address"
        android:gravity="center_vertical"
        android:drawablePadding="5dp"
        android:padding="10dp"
        />
    봉 인 된 도구 클래스
    
    public class AddressToast {
      private WindowManager mWm;
      private WindowManager.LayoutParams mParams;
      private Context mContext;
      private View mV;
    
      public AddressToast(Context context){
        this.mContext = context;
        // 1   WindowManger   
        mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        // 2   LayoutParams
        mParams = new WindowManager.LayoutParams();
        // 3       
        mParams.width=WindowManager.LayoutParams.WRAP_CONTENT;
        mParams.height=WindowManager.LayoutParams.WRAP_CONTENT;
        mParams.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
        // params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        // | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
        mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;  
      }
    
      //    
      public void show(String msg){
        // 4     View
        mV = View.inflate(mContext, R.layout.view_toast, null);
        // 5 WindowManager:addView(view,params);
        mWm.addView(mV, mParams);
      }
      public void hide() {
        if (mV != null) {
          if (mV.getParent() != null) {
            mWm.removeView(mV);
          }
          mV = null;
        }
      }
    }
    도구 클래스 의 논리 호출:
    
    public void clickMe2(View v) {
        mToast = new AddressToast(this);
        mToast.show("         ....");
      }
    
      public void clickMe3(View v) {
        mToast.hide();
      }
      //onPause()     ,    
      @Override
      protected void onPause() {
        super.onPause();
        //remove
        if(mV!=null){
          if(mV.getParent()!=null){
            mWm.removeView(mV);
          }
          mV=null;
        }
      }
    발생 한 view 설정 접촉 감청 이벤트
    방금 팝 업 된 window 는 아직 이동 할 수 없습니다.접촉 을 설정 하여 mv.setOnTouch Listener(this)를 추가 하고 인터페이스 OnTouch Listener 의 onTouch 방법 을 실현 할 수 있 습 니 다.
    
    @Override
      public boolean onTouch(View v, MotionEvent event) {
        // getX    widget           X    
        // getRawX                   X    
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
          // Log.d("example", "ACTION_DOWN");
          mDownX = event.getRawX();
          mDownY = event.getRawY();
          break;
        case MotionEvent.ACTION_MOVE:
          // Log.d("example", "ACTION_MOVE");
          float moveX = event.getRawX();
          float moveY = event.getRawY();
          // x
          int dx = (int) (moveX - mDownX + 0.5f); // 0.5f      (int)4.1 4
          int dy = (int) (moveY - mDownY + 0.5f);
          Log.d("example", "dx=" + dx);
          mParams.x += dx;
          mParams.y += dy;
          //7.     
          mWm.updateViewLayout(mV, mParams);
          //          
          mDownX = moveX;
          mDownY = moveY;
          break;
        case MotionEvent.ACTION_UP:
          // Log.d("example", "ACTION_UP");
          break;
    
        default:
          break;
        }
        return false;
      }
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기