안 드 로 이 드 는 Activity 를 왼쪽 으로 미 끄 러 뜨리 는 완벽 한 패 키 징 을 실현 합 니 다.

1:자신의 부모 용 기 를 정의 하여 하나의 레이아웃 에서 계승 하도록 합 니 다(LinearLayout,RelativeLayout 모두 가능)

public class SildingFinishLayout extends RelativeLayout implements View.OnTouchListener {
  /**
   * SildingFinishLayout      
   */
  private ViewGroup mParentView;
  /**
   *        View
   */
  private View touchView;
  /**
   *        
   */
  private int mTouchSlop;
  /**
   *     X  
   */
  private int downX;
  /**
   *     Y  
   */
  private int downY;
  /**
   *     X  
   */
  private int tempX;
  /**
   *    
   */
  private Scroller mScroller;
  /**
   * SildingFinishLayout   
   */
  private int viewWidth;
  /**
   *         
   */
  private boolean isSilding;


  private OnSildingFinishListener onSildingFinishListener;
  private boolean isFinish;


  public SildingFinishLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }


  public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);


    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    mScroller = new Scroller(context);
  }


  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    if (changed) {
//   SildingFinishLayout        
      mParentView = (ViewGroup) this.getParent();
      viewWidth = this.getWidth();
    }
  }


  /**
   *   OnSildingFinishListener,  onSildingFinish()   finish Activity
   *
   * @param onSildingFinishListener
   */
  public void setOnSildingFinishListener(
      OnSildingFinishListener onSildingFinishListener) {
    this.onSildingFinishListener = onSildingFinishListener;
  }


  /**
   *   Touch View
   *
   * @param touchView
   */
  public void setTouchView(View touchView) {
    this.touchView = touchView;
    touchView.setOnTouchListener(this);
  }


  public View getTouchView() {
    return touchView;
  }


  /**
   *      
   */
  private void scrollRight() {
    final int delta = (viewWidth + mParentView.getScrollX());
//   startScroll            ,   computeScroll()     scrollTo   item
    mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
        Math.abs(delta));
    postInvalidate();
  }


  /**
   *        
   */
  private void scrollOrigin() {
    int delta = mParentView.getScrollX();
    mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
        Math.abs(delta));
    postInvalidate();
  }


  /**
   * touch View   AbsListView,   ListView, GridView    
   *
   * @return
   */
  private boolean isTouchOnAbsListView() {
    return touchView instanceof AbsListView ? true : false;
  }


  /**
   * touch view   ScrollView     
   *
   * @return
   */
  private boolean isTouchOnScrollView() {
    return touchView instanceof ScrollView ? true : false;
  }


  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        downX = tempX = (int) event.getRawX();
        downY = (int) event.getRawY();
        break;
      case MotionEvent.ACTION_MOVE:
        int moveX = (int) event.getRawX();
        int deltaX = tempX - moveX;
        tempX = moveX;
        if (Math.abs(moveX - downX) > mTouchSlop
            && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
          isSilding = true;


//  touchView AbsListView,
//       ,  item     ,          item       
          if (isTouchOnAbsListView()) {
            MotionEvent cancelEvent = MotionEvent.obtain(event);
            cancelEvent
                .setAction(MotionEvent.ACTION_CANCEL
                    | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
            v.onTouchEvent(cancelEvent);
          }


        }


        if (moveX - downX >= 0 && isSilding) {
          mParentView.scrollBy(deltaX, 0);


//         ListView ScrollView        
          if (isTouchOnScrollView() || isTouchOnAbsListView()) {
            return true;
          }
        }
        break;
      case MotionEvent.ACTION_UP:
        isSilding = false;
        if (mParentView.getScrollX() <= -viewWidth / 2) {
          isFinish = true;
          scrollRight();
        } else {
          scrollOrigin();
          isFinish = false;
        }
        break;
    }


//   touch view AbsListView  ScrollView               
//    AbsListView, ScrollView          
    if (isTouchOnScrollView() || isTouchOnAbsListView()) {
      return v.onTouchEvent(event);
    }


//          true
    return true;
  }


  @Override
  public void computeScroll() {
//   startScroll   scroller.computeScrollOffset()  true,
    if (mScroller.computeScrollOffset()) {
      mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
      postInvalidate();


      if (mScroller.isFinished()) {


        if (onSildingFinishListener != null && isFinish) {
          onSildingFinishListener.onSildingFinish();
        }
      }
    }
  }

  public interface OnSildingFinishListener {
    public void onSildingFinish();
  }
}
2.Acitity
Activity 의 onCreate()방법 에서  

 @Override
  public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.timed_task_SildingFinishLayout);
mSildingFinishLayout
    mSildingFinishLayout .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
      @Override
      public void onSildingFinish() {
        finish();
      }
    });
    mSildingFinishLayout .setTouchView(mSildingFinishLayout);//            :         activity     view     
  }
지금까지 이 기능 은 이미 실현 되 었 다.
문제 해결:이것 은 왼쪽 미끄럼 배경 흰색 문제 가 발생 할 수 있 습 니 다.
1.style.xml 에 추가

<style name="AppTheme" parent="android:Theme.Light">
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowBackground">@android:color/transparent</item>
</style>
2.acvitiy 의 속성 에

android:theme="@style/AppTheme" 
3 일부 속성의 상세 한 해석

<item name="android:windowFrame">@null</item> :Dialog windowFrame   
<item name="android:windowIsFloating">true</item>:     activity  
<item name="android:windowIsTranslucent">false</item>:     
<item name="android:windowNoTitle">true</item>:    title
<item name="android:windowBackground">@drawable/dia_bg</item>:  dialog   
<item name="android:backgroundDimEnabled">false</item>:         
안 드 로 이 드 가 왼쪽 슬라이더 를 실현 하고 Activity 를 종료 하 는 완벽 한 패키지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 안 드 로 이 드 왼쪽 슬라이더 를 종료 하 는 Activity 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기