diff --git a/dragsloplayout/src/main/java/com/dl7/drag/DragSlopLayout.java b/dragsloplayout/src/main/java/com/dl7/drag/DragSlopLayout.java index 142986e..2570c5d 100644 --- a/dragsloplayout/src/main/java/com/dl7/drag/DragSlopLayout.java +++ b/dragsloplayout/src/main/java/com/dl7/drag/DragSlopLayout.java @@ -11,6 +11,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.IntDef; +import android.support.v4.view.MotionEventCompat; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.NestedScrollView; @@ -25,6 +26,7 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewParent; import android.view.animation.BounceInterpolator; @@ -115,6 +117,8 @@ public class DragSlopLayout extends FrameLayout { private View mAttachScrollView; // 手势控制 private GestureDetector mGestureDetector; + // DragView的Top属性值 + private int mDragViewTop = 0; public DragSlopLayout(Context context) { @@ -136,6 +140,7 @@ private void _init(Context context, AttributeSet attrs) { mGestureDetector = new GestureDetector(context, mGestureListener); mFallBoundScroller = ScrollerCompat.create(context, new BounceInterpolator()); mComeBackScroller = ScrollerCompat.create(context, new DecelerateInterpolator()); + mMinTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DragSlopLayout, 0, 0); mFixHeight = a.getDimensionPixelOffset(R.styleable.DragSlopLayout_fix_height, mFixHeight); @@ -192,6 +197,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 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)); @@ -201,7 +207,6 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); - MarginLayoutParams lp; View childView = getChildAt(2); lp = (MarginLayoutParams) childView.getLayoutParams(); @@ -214,27 +219,28 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { // 固定高度超过子视图高度则设置为子视图高度 mFixHeight = childHeight; } - int childTop; - if (mDragStatus == STATUS_EXIT) { - // 对于 ViewPager 换页后会回调 onLayout(),需要进行处理 - if (mMode == MODE_DRAG || mMode == MODE_DRAG_OUTSIDE) { - childTop = b; - } else { - childTop = b - mFixHeight; - childView.setTranslationY(childHeight); - } - } else if (mDragStatus == STATUS_COLLAPSED) { - childTop = b - mFixHeight; - } else if (mDragStatus == STATUS_EXPANDED) { - childTop = b - childHeight; - } else { - childTop = b - mFixHeight; - } - childView.layout(lp.leftMargin, childTop, lp.leftMargin + childWidth, childTop + childHeight); - mCriticalTop = b - (childHeight - mFixHeight) / 2 - mFixHeight; mExpandedTop = b - childHeight; mCollapsedTop = b - mFixHeight; + // 如果本身 mDragViewTop 已经有值,则直接使用,不然会出现突然闪一下的情况 + if (mDragViewTop == 0) { + if (mDragStatus == STATUS_EXIT) { + // 对于 ViewPager 换页后会回调 onLayout(),需要进行处理 + if (mMode == MODE_DRAG || mMode == MODE_DRAG_OUTSIDE) { + mDragViewTop = b; + } else { + mDragViewTop = b - mFixHeight; + childView.setTranslationY(childHeight); + } + } else if (mDragStatus == STATUS_COLLAPSED) { + mDragViewTop = b - mFixHeight; + } else if (mDragStatus == STATUS_EXPANDED) { + mDragViewTop = b - childHeight; + } else { + mDragViewTop = b - mFixHeight; + } + } + childView.layout(lp.leftMargin, mDragViewTop, lp.leftMargin + childWidth, mDragViewTop + childHeight); } @Override @@ -254,6 +260,17 @@ protected void onDetachedFromWindow() { * ViewDragHelper ********************************************/ + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + switch (MotionEventCompat.getActionMasked(ev)) { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mIsDrag = false; + break; + } + return super.dispatchTouchEvent(ev); + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean isIntercept = mDragHelper.shouldInterceptTouchEvent(ev); @@ -262,7 +279,8 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { } else if (mDragHelper.isViewUnder(mDragView, (int) ev.getX(), (int) ev.getY()) && mMode != MODE_ANIMATE) { // 处于拖拽模式且点击到拖拽视图则停止滚动 _stopAllScroller(); - } else if (mMode == MODE_DRAG_OUTSIDE) { + } + if (mMode == MODE_DRAG_OUTSIDE && !mIsDrag) { mGestureDetector.onTouchEvent(ev); } return isIntercept; @@ -292,7 +310,9 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d if (isDownTouch) { // 如果为上下滑动则控制拖拽 if (Math.abs(distanceY) > Math.abs(distanceX)) { + _stopAllScroller(); mDragHelper.captureChildView(mDragView, 0); + mIsDrag = true; } isDownTouch = false; } @@ -450,7 +470,8 @@ private void _stopAllScroller() { /** * 滚出屏幕 - * @param duration 时间 + * + * @param duration 时间 */ public void scrollOutScreen(int duration) { mIsDoOutAnim = true; @@ -460,7 +481,8 @@ public void scrollOutScreen(int duration) { /** * 滚进屏幕 - * @param duration 时间 + * + * @param duration 时间 */ public void scrollInScreen(int duration) { mIsDoOutAnim = false; @@ -556,6 +578,15 @@ public void run() { * @param percent 百分比 */ private void _dragPositionChanged(int visibleHeight, float percent) { + if (mDragViewTop == 0) { + mLastDragViewTop = mHeight - visibleHeight; + } + mDragViewTop = mHeight - visibleHeight; + // 拖拽距离超过最小滑动距离则进行判断 + if (Math.abs(mDragViewTop - mLastDragViewTop) > mMinTouchSlop) { + mIsUp = (mDragViewTop < mLastDragViewTop); + mLastDragViewTop = mDragViewTop; + } if (mEnableBlur && mBlurDrawable != null) { if (visibleHeight < mFixHeight) { return; @@ -571,6 +602,9 @@ private void _dragPositionChanged(int visibleHeight, float percent) { if (visibleHeight >= 0) { ViewCompat.setTranslationY(mMainView, -visibleHeight * (1 - mCollapseParallax)); } + if (mDragPositionListener != null) { + mDragPositionListener.onDragPosition(visibleHeight, percent, mIsUp); + } } /*********************************** ScrollView ********************************************/ @@ -1019,4 +1053,37 @@ public void run() { } }).start(); } + + /** ================================ 监听器 ================================ */ + + // 监听器 + private OnDragPositionListener mDragPositionListener; + // 是否向上拖拽 + private boolean mIsUp = false; + // 上一次比较时的拖拽高度 + private int mLastDragViewTop; + // 最小触摸滑动距离 + private int mMinTouchSlop; + + /** + * 设置监听器 + * @param dragPositionListener + */ + public void setDragPositionListener(OnDragPositionListener dragPositionListener) { + mDragPositionListener = dragPositionListener; + } + + /** + * 拖拽监听器 + */ + public interface OnDragPositionListener { + + /** + * 拖拽监听 + * @param visibleHeight 可见高度 + * @param percent 可见百分比 + * @param isUp 是否向上拖拽 + */ + void onDragPosition(int visibleHeight, float percent, boolean isUp); + } } diff --git a/simple/build.gradle b/simple/build.gradle index 7a3e3fe..53cb40b 100644 --- a/simple/build.gradle +++ b/simple/build.gradle @@ -26,8 +26,10 @@ dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:design:23.4.0' compile project(':dragsloplayout') // compile 'com.github.Rukey7:DragSlopLayout:1.0.2' +// compile 'com.github.Rukey7:DragSlopLayout:1.0.2-blur' // photoview compile 'com.github.chrisbanes.photoview:library:1.2.4' // butterknife diff --git a/simple/src/main/java/com/dl7/simple/drag/activity/AnimateActivity.java b/simple/src/main/java/com/dl7/simple/drag/activity/AnimateActivity.java index 1a32135..9360456 100644 --- a/simple/src/main/java/com/dl7/simple/drag/activity/AnimateActivity.java +++ b/simple/src/main/java/com/dl7/simple/drag/activity/AnimateActivity.java @@ -18,7 +18,7 @@ import com.dl7.drag.DragSlopLayout; import com.dl7.drag.animate.CustomViewAnimator; import com.dl7.simple.drag.AnimateHelper; -import com.dl7.simple.drag.PhotoPagerAdapter; +import com.dl7.simple.drag.adapter.PhotoPagerAdapter; import com.dl7.simple.drag.R; import java.util.ArrayList; diff --git a/simple/src/main/java/com/dl7/simple/drag/activity/DragActivity.java b/simple/src/main/java/com/dl7/simple/drag/activity/DragActivity.java index 672b1c2..75765ac 100644 --- a/simple/src/main/java/com/dl7/simple/drag/activity/DragActivity.java +++ b/simple/src/main/java/com/dl7/simple/drag/activity/DragActivity.java @@ -9,7 +9,7 @@ import android.widget.TextView; import com.dl7.drag.DragSlopLayout; -import com.dl7.simple.drag.PhotoPagerAdapter; +import com.dl7.simple.drag.adapter.PhotoPagerAdapter; import com.dl7.simple.drag.R; import java.util.ArrayList; diff --git a/simple/src/main/java/com/dl7/simple/drag/activity/DragOutsideActivity.java b/simple/src/main/java/com/dl7/simple/drag/activity/DragOutsideActivity.java index dd35b12..7002999 100644 --- a/simple/src/main/java/com/dl7/simple/drag/activity/DragOutsideActivity.java +++ b/simple/src/main/java/com/dl7/simple/drag/activity/DragOutsideActivity.java @@ -2,40 +2,46 @@ import android.os.Bundle; import android.support.v4.view.ViewPager; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; -import android.widget.ScrollView; -import android.widget.TextView; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; import com.dl7.drag.DragSlopLayout; -import com.dl7.simple.drag.PhotoPagerAdapter; import com.dl7.simple.drag.R; +import com.dl7.simple.drag.adapter.PhotoPagerAdapter; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; public class DragOutsideActivity extends BaseActivity { + @BindView(R.id.vp_photo) ViewPager mVpPhoto; - @BindView(R.id.tv_title) - TextView mTvTitle; - @BindView(R.id.tv_count) - TextView mTvCount; - @BindView(R.id.tv_index) - TextView mTvIndex; - @BindView(R.id.tv_content) - TextView mTvContent; - @BindView(R.id.sv_view) - ScrollView mSvView; - @BindView(R.id.drag_layout) - DragSlopLayout mDragLayout; + @BindView(R.id.rv_relate_list) + RecyclerView mRvRelateList; @BindView(R.id.tool_bar) Toolbar mToolBar; + @BindView(R.id.iv_favorite) + ImageView mIvFavorite; + @BindView(R.id.iv_download) + ImageView mIvDownload; + @BindView(R.id.iv_praise) + ImageView mIvPraise; + @BindView(R.id.iv_share) + ImageView mIvShare; + @BindView(R.id.bottom_bar) + LinearLayout mBottomBar; + @BindView(R.id.drag_layout) + DragSlopLayout mDragLayout; private boolean mIsInteract = true; @@ -44,18 +50,8 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_drag_outside); ButterKnife.bind(this); - initToolBar(mToolBar, true, ""); + initToolBar(mToolBar, true, "Drag Outside Mode"); - final String[] titleList = new String[]{ - "汤姆·哈迪", "克里斯蒂安·贝尔", "马克·沃尔伯格", "威尔·史密斯", "丹泽尔·华盛顿", - }; - final String[] descList = new String[]{ - getString(R.string.TomHardy), - getString(R.string.ChristianBale), - getString(R.string.MarkWahlberg), - getString(R.string.WillSmith), - getString(R.string.DenzelWashington), - }; List imgList = new ArrayList<>(); imgList.add(R.mipmap.img1); imgList.add(R.mipmap.img2); @@ -65,24 +61,8 @@ protected void onCreate(Bundle savedInstanceState) { PhotoPagerAdapter mPagerAdapter = new PhotoPagerAdapter(this, imgList, false); mVpPhoto.setAdapter(mPagerAdapter); - // 实现 ScrollView 的平滑滚动 - mDragLayout.setAttachScrollView(mSvView); // 和 ViewPager 联动 mDragLayout.interactWithViewPager(mIsInteract); - - mTvCount.setText("" + imgList.size()); - mTvTitle.setText(titleList[0]); - mTvIndex.setText("" + 1); - mTvContent.setText(descList[0]); - - mVpPhoto.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { - @Override - public void onPageSelected(int position) { - mTvTitle.setText(titleList[position]); - mTvIndex.setText("" + (position + 1)); - mTvContent.setText(descList[position]); - } - }); } @Override @@ -102,4 +82,18 @@ public boolean onOptionsItemSelected(MenuItem item) { } return super.onOptionsItemSelected(item); } + + @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()) { + case R.id.iv_favorite: + break; + case R.id.iv_download: + break; + case R.id.iv_praise: + break; + case R.id.iv_share: + break; + } + } } diff --git a/simple/src/main/java/com/dl7/simple/drag/adapter/BaseRecyclerAdapter.java b/simple/src/main/java/com/dl7/simple/drag/adapter/BaseRecyclerAdapter.java new file mode 100644 index 0000000..a8bcf63 --- /dev/null +++ b/simple/src/main/java/com/dl7/simple/drag/adapter/BaseRecyclerAdapter.java @@ -0,0 +1,112 @@ +package com.dl7.simple.drag.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Created by 95 on 2016/4/21. + * 适配器基类 + */ +public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter { + + protected Context mContext; + protected List mDatas; + + + public BaseRecyclerAdapter(Context context) { + this.mContext = context; + this.mDatas = new ArrayList<>(); + } + + public BaseRecyclerAdapter(Context context, List datas) { + this.mContext = context; + this.mDatas = datas; + } + + public BaseRecyclerAdapter(Context context, T[] datas) { + this.mContext = context; + this.mDatas = new ArrayList(); + Collections.addAll(mDatas, datas); + } + + @Override + public int getItemCount() { + return mDatas == null ? 0 : mDatas.size(); + } + + /** + * 更新数据,替换原有数据 + * @param items + */ + public void updateItems(List items) { + mDatas = items; + notifyDataSetChanged(); + } + + /** + * 插入一条数据 + * @param item 数据 + */ + public void addItem(T item) { + mDatas.add(0, item); + notifyItemInserted(0); + } + + /** + * 插入一条数据 + * @param item 数据 + * @param position 插入位置 + */ + public void addItem(T item, int position) { + position = Math.min(position, mDatas.size()); + mDatas.add(position, item); + notifyItemInserted(position); + } + + /** + * 在列表尾添加一串数据 + * @param items + */ + public void addItems(List items) { + mDatas.addAll(items); + } + + /** + * 移除一条数据 + * @param position 位置 + */ + public void removeItem(int position) { + if (position > mDatas.size() - 1) { + return; + } + mDatas.remove(position); + notifyItemRemoved(position); + } + + /** + * 移除一条数据 + * @param item 数据 + */ + public void removeItem(T item) { + int pos = 0; + for (T info : mDatas) { + if (item.hashCode() == info.hashCode()) { + removeItem(pos); + break; + } + pos++; + } + } + + /** + * 清除所有数据 + */ + public void cleanItems() { + mDatas.clear(); + notifyDataSetChanged(); + } +} diff --git a/simple/src/main/java/com/dl7/simple/drag/adapter/DividerGridItemDecoration.java b/simple/src/main/java/com/dl7/simple/drag/adapter/DividerGridItemDecoration.java new file mode 100644 index 0000000..3bc80dd --- /dev/null +++ b/simple/src/main/java/com/dl7/simple/drag/adapter/DividerGridItemDecoration.java @@ -0,0 +1,152 @@ +package com.dl7.simple.drag.adapter; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.RecyclerView.LayoutManager; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.View; + +/** + * 网格列表分割线 + */ +public class DividerGridItemDecoration extends RecyclerView.ItemDecoration { + + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + private Drawable mDivider; + + public DividerGridItemDecoration(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + a.recycle(); + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + + drawHorizontal(c, parent); + drawVertical(c, parent); + + } + + private int getSpanCount(RecyclerView parent) { + // 列数 + int spanCount = -1; + LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + + spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + spanCount = ((StaggeredGridLayoutManager) layoutManager) + .getSpanCount(); + } + return spanCount; + } + + public void drawHorizontal(Canvas c, RecyclerView parent) { + int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int left = child.getLeft() - params.leftMargin; + final int right = child.getRight() + params.rightMargin + + mDivider.getIntrinsicWidth(); + final int top = child.getBottom() + params.bottomMargin; + final int bottom = top + mDivider.getIntrinsicHeight(); + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + public void drawVertical(Canvas c, RecyclerView parent) { + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int top = child.getTop() - params.topMargin; + final int bottom = child.getBottom() + params.bottomMargin; + final int left = child.getRight() + params.rightMargin; + final int right = left + mDivider.getIntrinsicWidth(); + + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + private boolean isLastColum(RecyclerView parent, int pos, int spanCount, + int childCount) { + LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 + { + return true; + } + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + int orientation = ((StaggeredGridLayoutManager) layoutManager) + .getOrientation(); + if (orientation == StaggeredGridLayoutManager.VERTICAL) { + if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 + { + return true; + } + } else { + childCount = childCount - childCount % spanCount; + if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 + return true; + } + } + return false; + } + + private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, + int childCount) { + LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + childCount = childCount - childCount % spanCount; + if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 + return true; + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + int orientation = ((StaggeredGridLayoutManager) layoutManager) + .getOrientation(); + // StaggeredGridLayoutManager 且纵向滚动 + if (orientation == StaggeredGridLayoutManager.VERTICAL) { + childCount = childCount - childCount % spanCount; + // 如果是最后一行,则不需要绘制底部 + if (pos >= childCount) + return true; + } else + // StaggeredGridLayoutManager 且横向滚动 + { + // 如果是最后一行,则不需要绘制底部 + if ((pos + 1) % spanCount == 0) { + return true; + } + } + } + return false; + } + + @Override + public void getItemOffsets(Rect outRect, int itemPosition, + RecyclerView parent) { + int spanCount = getSpanCount(parent); + int childCount = parent.getAdapter().getItemCount(); + if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部 + { + outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); + } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边 + { + outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); + } else { + outRect.set(0, 0, mDivider.getIntrinsicWidth(), + mDivider.getIntrinsicHeight()); + } + } +} diff --git a/simple/src/main/java/com/dl7/simple/drag/adapter/DividerItemDecoration.java b/simple/src/main/java/com/dl7/simple/drag/adapter/DividerItemDecoration.java new file mode 100644 index 0000000..b18192d --- /dev/null +++ b/simple/src/main/java/com/dl7/simple/drag/adapter/DividerItemDecoration.java @@ -0,0 +1,92 @@ +package com.dl7.simple.drag.adapter; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +/** + * Created by long on 2016/3/29. + */ +public class DividerItemDecoration extends RecyclerView.ItemDecoration { + + private static final int[] ATTRS = new int[]{ + android.R.attr.listDivider + }; + + public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; + public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; + private Drawable mDivider; + private int mOrientation; + + public DividerItemDecoration(Context context, int orientation) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + a.recycle(); + setOrientation(orientation); + } + + public void setOrientation(int orientation) { + if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { + throw new IllegalArgumentException("invalid orientation"); + } + mOrientation = orientation; + } + + @Override + public void onDraw(Canvas c, RecyclerView parent) { + if (mOrientation == VERTICAL_LIST) { + drawVertical(c, parent); + } else { + drawHorizontal(c, parent); + } + + } + + + public void drawVertical(Canvas c, RecyclerView parent) { + final int left = parent.getPaddingLeft(); + final int right = parent.getWidth() - parent.getPaddingRight(); + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int top = child.getBottom() + params.bottomMargin; + final int bottom = top + mDivider.getIntrinsicHeight(); + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + public void drawHorizontal(Canvas c, RecyclerView parent) { + final int top = parent.getPaddingTop(); + final int bottom = parent.getHeight() - parent.getPaddingBottom(); + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int left = child.getRight() + params.rightMargin; + final int right = left + mDivider.getIntrinsicHeight(); + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + @Override + public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { + if (mOrientation == VERTICAL_LIST) { + outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); + } else { + outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); + } + } +} diff --git a/simple/src/main/java/com/dl7/simple/drag/PhotoPagerAdapter.java b/simple/src/main/java/com/dl7/simple/drag/adapter/PhotoPagerAdapter.java similarity index 98% rename from simple/src/main/java/com/dl7/simple/drag/PhotoPagerAdapter.java rename to simple/src/main/java/com/dl7/simple/drag/adapter/PhotoPagerAdapter.java index 6326435..827078a 100644 --- a/simple/src/main/java/com/dl7/simple/drag/PhotoPagerAdapter.java +++ b/simple/src/main/java/com/dl7/simple/drag/adapter/PhotoPagerAdapter.java @@ -1,4 +1,4 @@ -package com.dl7.simple.drag; +package com.dl7.simple.drag.adapter; import android.content.Context; import android.support.v4.view.PagerAdapter; diff --git a/simple/src/main/java/com/dl7/simple/drag/adapter/RecyclerViewHelper.java b/simple/src/main/java/com/dl7/simple/drag/adapter/RecyclerViewHelper.java new file mode 100644 index 0000000..89b942d --- /dev/null +++ b/simple/src/main/java/com/dl7/simple/drag/adapter/RecyclerViewHelper.java @@ -0,0 +1,99 @@ +package com.dl7.simple.drag.adapter; + +import android.content.Context; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; + + +/** + * Created by long on 2016/3/30. + * 视图帮助类 + */ +public class RecyclerViewHelper { + + private RecyclerViewHelper() { + throw new RuntimeException("RecyclerViewHelper cannot be initialized!"); + } + + /** + * 配置垂直列表RecyclerView + * @param view + */ + public static void initRecyclerViewV(Context context, RecyclerView view, boolean isDivided, + RecyclerView.Adapter adapter) { + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + layoutManager.setOrientation(LinearLayoutManager.VERTICAL); + view.setLayoutManager(layoutManager); + view.setItemAnimator(new DefaultItemAnimator()); + if (isDivided) { + view.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST)); + } + view.setAdapter(adapter); + } + + public static void initRecyclerViewV(Context context, RecyclerView view, RecyclerView.Adapter adapter) { + initRecyclerViewV(context, view, false, adapter); + } + + /** + * 配置水平列表RecyclerView + * @param view + */ + public static void initRecyclerViewH(Context context, RecyclerView view, boolean isDivided, + RecyclerView.Adapter adapter) { + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + view.setLayoutManager(layoutManager); + view.setItemAnimator(new DefaultItemAnimator()); + if (isDivided) { + view.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL_LIST)); + } + view.setAdapter(adapter); + } + + public static void initRecyclerViewH(Context context, RecyclerView view, RecyclerView.Adapter adapter) { + initRecyclerViewH(context, view, false, adapter); + } + + /** + * 配置网格列表RecyclerView + * @param view + */ + public static void initRecyclerViewG(Context context, RecyclerView view, boolean isDivided, + RecyclerView.Adapter adapter, int column) { + GridLayoutManager layoutManager = new GridLayoutManager(context, column, LinearLayoutManager.VERTICAL, false); + view.setLayoutManager(layoutManager); + view.setItemAnimator(new DefaultItemAnimator()); + if (isDivided) { + view.addItemDecoration(new DividerGridItemDecoration(context)); + } + view.setAdapter(adapter); + } + + public static void initRecyclerViewG(Context context, RecyclerView view, RecyclerView.Adapter adapter, int column) { + initRecyclerViewG(context, view, false, adapter, column); + } + + + /** + * 配置瀑布流列表RecyclerView + * @param view + */ + public static void initRecyclerViewSV(Context context, RecyclerView view, boolean isDivided, + RecyclerView.Adapter adapter, int column) { + StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(column, StaggeredGridLayoutManager.VERTICAL); + view.setLayoutManager(layoutManager); + view.setItemAnimator(new DefaultItemAnimator()); + if (isDivided) { + view.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST)); + } + view.setAdapter(adapter); + } + + public static void initRecyclerViewSV(Context context, RecyclerView view, RecyclerView.Adapter adapter, int column) { + initRecyclerViewSV(context, view, false, adapter, column); + } +} diff --git a/simple/src/main/res/layout/activity_drag_outside.xml b/simple/src/main/res/layout/activity_drag_outside.xml index 0014332..efe0dba 100644 --- a/simple/src/main/res/layout/activity_drag_outside.xml +++ b/simple/src/main/res/layout/activity_drag_outside.xml @@ -18,66 +18,75 @@ + android:orientation="vertical" + android:background="@android:color/white" + android:layout_height="wrap_content"> - + + + android:layout_height="128dp"/> + + - + + + + - + - + - - + - + - - + - -