Skip to content

Commit

Permalink
更新拖拽处理,更新例子
Browse files Browse the repository at this point in the history
  • Loading branch information
Rukey7 committed Jan 6, 2017
1 parent c3b0928 commit 9316bdd
Show file tree
Hide file tree
Showing 10 changed files with 261 additions and 34 deletions.
4 changes: 2 additions & 2 deletions dragsloplayout/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 2
versionName "1.0.2"
versionCode 3
versionName "1.0.3"
renderscriptTargetApi 23
renderscriptSupportModeEnabled true
}
Expand Down
36 changes: 18 additions & 18 deletions dragsloplayout/src/main/java/com/dl7/drag/DragSlopLayout.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,21 +186,23 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

if (mMaxHeight == 0) {
// 未设置最大高度则为布局高度的 2/3
mMaxHeight = getMeasuredHeight() * 2 / 3;
}
View childView = getChildAt(2);
MarginLayoutParams lp = (MarginLayoutParams) childView.getLayoutParams();
int childWidth = childView.getMeasuredWidth();
int childHeight = childView.getMeasuredHeight();
// 限定视图的最大高度
if (childHeight > mMaxHeight) {
mMaxHeight = childHeight;
MeasureSpec.makeMeasureSpec(childWidth - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY);
childView.measure(MeasureSpec.makeMeasureSpec(childWidth - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mMaxHeight - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY));
if (mMode == MODE_DRAG) {
if (mMaxHeight == 0) {
// 未设置最大高度则为布局高度的 2/3
mMaxHeight = getMeasuredHeight() * 2 / 3;
} else if (mMaxHeight > getMeasuredHeight()) {
// MODE_DRAG 模式最大高度不超过布局高度
mMaxHeight = getMeasuredHeight();
}
View childView = getChildAt(2);
MarginLayoutParams lp = (MarginLayoutParams) childView.getLayoutParams();
int childWidth = childView.getMeasuredWidth();
int childHeight = childView.getMeasuredHeight();
// 限定视图的最大高度
if (childHeight > mMaxHeight) {
childView.measure(MeasureSpec.makeMeasureSpec(childWidth - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mMaxHeight - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY));
}
}
}

Expand All @@ -223,7 +225,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
mExpandedTop = b - childHeight;
mCollapsedTop = b - mFixHeight;
// 如果本身 mDragViewTop 已经有值,则直接使用,不然会出现突然闪一下的情况
if (mDragViewTop == 0) {
if (mDragViewTop == 0 || mMode != MODE_DRAG_OUTSIDE) {
if (mDragStatus == STATUS_EXIT) {
// 对于 ViewPager 换页后会回调 onLayout(),需要进行处理
if (mMode == MODE_DRAG || mMode == MODE_DRAG_OUTSIDE) {
Expand Down Expand Up @@ -326,7 +328,6 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d

@Override
public boolean tryCaptureView(View child, int pointerId) {
requestDisallowInterceptTouchEvent(true);
mIsDrag = child == mDragView;
return mIsDrag;
}
Expand Down Expand Up @@ -363,7 +364,6 @@ public void onViewReleased(View releasedChild, float xvel, float yvel) {
ViewCompat.postInvalidateOnAnimation(DragSlopLayout.this);
}
}
requestDisallowInterceptTouchEvent(false);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.dl7.simple.drag.activity;

import android.animation.Animator;
import android.os.Bundle;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
Expand All @@ -13,6 +15,9 @@
import com.dl7.drag.DragSlopLayout;
import com.dl7.simple.drag.R;
import com.dl7.simple.drag.adapter.PhotoPagerAdapter;
import com.dl7.simple.drag.adapter.ThumbAdapter;
import com.dl7.simple.drag.utils.AnimateHelper;
import com.dl7.simple.drag.utils.RecyclerViewHelper;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -23,7 +28,6 @@

public class DragOutsideActivity extends BaseActivity {


@BindView(R.id.vp_photo)
ViewPager mVpPhoto;
@BindView(R.id.rv_relate_list)
Expand All @@ -44,25 +48,88 @@ public class DragOutsideActivity extends BaseActivity {
DragSlopLayout mDragLayout;

private boolean mIsInteract = true;
private ThumbAdapter mAdapter;
private boolean mIsHideToolbar = false; // 是否隐藏 Toolbar
private Animator mToolBarAnimator;
private Animator mBottomBarAnimator;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drag_outside);
ButterKnife.bind(this);
initToolBar(mToolBar, true, "Drag Outside Mode");

// 设置 ViewPager
List<Integer> imgList = new ArrayList<>();
imgList.add(R.mipmap.img1);
imgList.add(R.mipmap.img2);
imgList.add(R.mipmap.img3);
imgList.add(R.mipmap.img4);
imgList.add(R.mipmap.img5);

PhotoPagerAdapter mPagerAdapter = new PhotoPagerAdapter(this, imgList, false);
imgList.add(R.mipmap.pic1);
imgList.add(R.mipmap.pic2);
imgList.add(R.mipmap.pic3);
imgList.add(R.mipmap.pic4);
imgList.add(R.mipmap.pic5);
PhotoPagerAdapter mPagerAdapter = new PhotoPagerAdapter(this, imgList, true);
mVpPhoto.setAdapter(mPagerAdapter);
mPagerAdapter.setListener(new PhotoPagerAdapter.OnPhotoClickListener() {
@Override
public void onPhotoClick() {
mIsHideToolbar = !mIsHideToolbar;
if (mIsHideToolbar) {
AnimateHelper.stopAnimator(mToolBarAnimator);
mToolBarAnimator = AnimateHelper.doMoveVertical(mToolBar, (int) mToolBar.getTranslationY(),
-mToolBar.getBottom(), 300);
if (mBottomBar.getTranslationY() != mBottomBar.getHeight()) {
AnimateHelper.stopAnimator(mBottomBarAnimator);
mBottomBarAnimator = AnimateHelper.doMoveVertical(mBottomBar, (int) mBottomBar.getTranslationY(),
mBottomBar.getHeight(), 300);
}
} else {
AnimateHelper.stopAnimator(mToolBarAnimator);
mToolBarAnimator = AnimateHelper.doMoveVertical(mToolBar, (int) mToolBar.getTranslationY(),
0, 300);
ViewCompat.animate(mToolBar).translationY(0).setDuration(300).start();
if (mBottomBar.getTranslationY() != 0) {
AnimateHelper.stopAnimator(mBottomBarAnimator);
mBottomBarAnimator = AnimateHelper.doMoveVertical(mBottomBar, (int) mBottomBar.getTranslationY(),
0, 300);
}
}
}
});
// 设置 RecyclerView
List<Integer> thumbList = new ArrayList<>();
thumbList.add(R.mipmap.pic1);
thumbList.add(R.mipmap.pic2);
thumbList.add(R.mipmap.pic3);
thumbList.add(R.mipmap.pic4);
thumbList.add(R.mipmap.pic5);
thumbList.add(R.mipmap.pic1);
thumbList.add(R.mipmap.pic2);
thumbList.add(R.mipmap.pic3);
thumbList.add(R.mipmap.pic4);
thumbList.add(R.mipmap.pic5);
thumbList.add(R.mipmap.pic1);
thumbList.add(R.mipmap.pic2);
thumbList.add(R.mipmap.pic3);
thumbList.add(R.mipmap.pic4);
thumbList.add(R.mipmap.pic5);
mAdapter = new ThumbAdapter(this, thumbList);
RecyclerViewHelper.initRecyclerViewH(this, mRvRelateList, mAdapter);
// 和 ViewPager 联动
mDragLayout.interactWithViewPager(mIsInteract);
mDragLayout.setDragPositionListener(new DragSlopLayout.OnDragPositionListener() {
@Override
public void onDragPosition(int visibleHeight, float percent, boolean isUp) {
if (AnimateHelper.isRunning(mBottomBarAnimator) || mIsHideToolbar) {
return;
}
if (isUp && mBottomBar.getTranslationY() != mBottomBar.getHeight()) {
mBottomBarAnimator = AnimateHelper.doMoveVertical(mBottomBar, (int) mBottomBar.getTranslationY(),
mBottomBar.getHeight(), 300);
} else if (!isUp && mBottomBar.getTranslationY() != 0) {
mBottomBarAnimator = AnimateHelper.doMoveVertical(mBottomBar, (int) mBottomBar.getTranslationY(),
0, 300);
}
}
});
}

@Override
Expand All @@ -83,6 +150,13 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

@Override
protected void onDestroy() {
super.onDestroy();
AnimateHelper.deleteAnimator(mToolBarAnimator);
AnimateHelper.deleteAnimator(mBottomBarAnimator);
}

@OnClick({R.id.iv_favorite, R.id.iv_download, R.id.iv_praise, R.id.iv_share})
public void onClick(View view) {
switch (view.getId()) {
Expand Down
48 changes: 48 additions & 0 deletions simple/src/main/java/com/dl7/simple/drag/adapter/ThumbAdapter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.dl7.simple.drag.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.dl7.simple.drag.R;

import java.util.List;

/**
* Created by long on 2017/1/6.
*/
public class ThumbAdapter extends BaseRecyclerAdapter<Integer> {

public ThumbAdapter(Context context) {
super(context);
}

public ThumbAdapter(Context context, List<Integer> datas) {
super(context, datas);
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.adapter_thumb, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((ViewHolder)holder).ivPhoto.setImageResource(mDatas.get(position));
}

public static class ViewHolder extends RecyclerView.ViewHolder{
public ImageView ivPhoto;

public ViewHolder(View rootView) {
super(rootView);
this.ivPhoto = (ImageView) rootView.findViewById(R.id.iv_photo);
}

}
}
71 changes: 71 additions & 0 deletions simple/src/main/java/com/dl7/simple/drag/utils/AnimateHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.dl7.simple.drag.utils;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.view.View;

/**
* Created by long on 2017/1/5.
*/

public final class AnimateHelper {

private AnimateHelper() {
throw new AssertionError();
}


/**
* 垂直偏移动画
* @param view
* @param startY
* @param endY
* @param duration
* @return
*/
public static Animator doMoveVertical(View view, int startY, int endY, int duration) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", startY, endY).setDuration(duration);
animator.start();
return animator;
}


/**
* 动画是否在运行
* @param animator
*/
public static boolean isRunning(Animator animator) {
return animator != null && animator.isRunning();
}

/**
* 启动动画
* @param animator
*/
public static void startAnimator(Animator animator) {
if (animator != null && !animator.isRunning()) {
animator.start();
}
}

/**
* 停止动画
* @param animator
*/
public static void stopAnimator(Animator animator) {
if (animator != null && animator.isRunning()) {
animator.cancel();
}
}

/**
* 删除动画
* @param animator
*/
public static void deleteAnimator(Animator animator) {
if (animator != null && animator.isRunning()) {
animator.cancel();
}
animator = null;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dl7.simple.drag.adapter;
package com.dl7.simple.drag.utils;

import android.content.Context;
import android.support.v7.widget.DefaultItemAnimator;
Expand All @@ -7,6 +7,9 @@
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;

import com.dl7.simple.drag.adapter.DividerGridItemDecoration;
import com.dl7.simple.drag.adapter.DividerItemDecoration;


/**
* Created by long on 2016/3/30.
Expand Down
Loading

0 comments on commit 9316bdd

Please sign in to comment.