本文实例为大家分享了androID vIEw实现横向滑动选择的具体代码,供大家参考,具体内容如下
做文字编辑,从网上找来的。
HorizontalScrollSelectVIEw:
public boolean mAlwaysOverrIDetouch = true; protected listadapter mAdapter; private int mleftVIEwIndex = -1; private int mRightVIEwIndex = 0; protected int mCurrentX; protected int mNextX; private int mMaxX = Integer.MAX_VALUE; private int mdisplayOffset = 0; protected Scroller mScroller; private GestureDetector mGesture; private Queue<VIEw> mRemovedVIEwQueue = new linkedList<VIEw>(); private OnItemSelectedListener mOnItemSelected; private OnItemClickListener mOnItemClicked; private OnItemLongClickListener mOnItemLongClicked; private OnScrollListener mScrollListener; /** * 选中item时图片 */ private Drawable mDrawable; private boolean mDataChanged = false; private Context context; private boolean scrollerFalg1 = false; private boolean scrollerFalg2 = false; private int position = 0x7f020000; public HorizontalScrollSelectVIEw(Context context,AttributeSet attrs) { super(context,attrs); this.context = context; initVIEw(); } private synchronized voID initVIEw() { mleftVIEwIndex = -1; mRightVIEwIndex = 0; mdisplayOffset = 0; mCurrentX = 0; mNextX = 0; mMaxX = Integer.MAX_VALUE; mScroller = new Scroller(getContext()); mGesture = new GestureDetector(getContext(),mOnGesture); } public voID setMScrollListener(OnScrollListener Listener) { mScrollListener = Listener; } @OverrIDe public voID setonItemSelectedListener(OnItemSelectedListener Listener) { mOnItemSelected = Listener; } @OverrIDe public voID setonItemClickListener(OnItemClickListener Listener) { mOnItemClicked = Listener; } @OverrIDe public voID setonItemLongClickListener(OnItemLongClickListener Listener) { mOnItemLongClicked = Listener; } /** * 设置选中状态时的图片 * * @param mDrawable */ public voID setSelectBitmap(Drawable mDrawable) { this.mDrawable = mDrawable; } private DataSetobserver mDataObserver = new DataSetobserver() { @OverrIDe public voID onChanged() { synchronized (HorizontalScrollSelectVIEw.this) { mDataChanged = true; } invalIDate(); requestLayout(); } @OverrIDe public voID onInvalIDated() { reset(); invalIDate(); requestLayout(); } }; @OverrIDe public listadapter getAdapter() { return mAdapter; } @OverrIDe public VIEw getSelectedVIEw() { //Todo: implement return null; } @OverrIDe public voID setAdapter(listadapter adapter) { if (mAdapter != null) { mAdapter.unregisterDataSetobserver(mDataObserver); } mAdapter = adapter; mAdapter.registerDataSetobserver(mDataObserver); reset(); } private synchronized voID reset() { initVIEw(); removeAllVIEwsInLayout(); requestLayout(); } @OverrIDe public voID setSelection(int position) { //Todo: implement int positionX = position * this.getWIDth(); int maxWIDth = this.getChildCount() * this.getWIDth(); if (positionX <= 0) { positionX = 0; } if (positionX > maxWIDth) { positionX = maxWIDth; } scrollTo(positionX); } private voID addAndMeasureChild(final VIEw child,int vIEwPos) { LayoutParams params = child.getLayoutParams(); if (params == null) { params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); } addVIEwInLayout(child,vIEwPos,params,true); child.measure(MeasureSpec.makeMeasureSpec(getWIDth(),MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(getHeight(),MeasureSpec.AT_MOST)); } @Suppresslint("NewAPI") @OverrIDe protected synchronized voID onLayout(boolean changed,int left,int top,int right,int bottom) { super.onLayout(changed,left,top,right,bottom); if (mAdapter == null) { return; } if (mDataChanged) { int oldCurrentX = mCurrentX; initVIEw(); removeAllVIEwsInLayout(); mNextX = oldCurrentX; mDataChanged = false; } if (mScroller.computeScrollOffset()) { int scrollx = mScroller.getCurrX(); mNextX = scrollx; } // if(mNextX <= 0){// mNextX = 0;// mScroller.forceFinished(true);// }// if(mNextX >= mMaxX) {// mNextX = mMaxX;// mScroller.forceFinished(true);// } int dx = mCurrentX - mNextX; removeNonVisibleItems(dx); fillList(dx); positionItems(dx);// Log.e("onlayout","mleftVIEwIndex"+(mleftVIEwIndex+1)); mCurrentX = mNextX; if (!mScroller.isFinished()) { post(new Runnable() { @OverrIDe public voID run() { requestLayout(); } }); } else { if (scrollerFalg1 || (!scrollerFalg1 && scrollerFalg2)) { VIEw chID = getChildAt(0); if (chID != null) { mdisplayOffset = 0; positionItems(0); if (mDrawable != null) { getChildAt(2).setBackground(mDrawable); } if (mScrollListener != null) { int position = (int) getChildAt(2).getTag(this.position); mScrollListener.onScrollSelectItem(this,position); } } } } } /** * 获取屏幕宽度 * * @param context * @return */ public static int getSecreenWIDth(Context context) { displayMetrics dm = new displayMetrics(); dm = context.getResources().getdisplayMetrics(); int screenWIDth = dm.wIDthPixels; return screenWIDth / 5; } private voID fillList(final int dx) { int edge = 0; VIEw child = getChildAt(0); if (child != null) { edge = child.getleft(); } fillListleft(edge,dx); edge = 0; child = getChildAt(getChildCount() - 1); if (child != null) { edge = child.getRight(); } fillListRight(edge,dx); } private voID fillListRight(int rightEdge,final int dx) { //&& mRightVIEwIndex < mAdapter.getCount() while (rightEdge + dx < getWIDth()) { if (mRightVIEwIndex >= mAdapter.getCount()) { mRightVIEwIndex = 0; } VIEw child = mAdapter.getVIEw(mRightVIEwIndex,mRemovedVIEwQueue.poll(),this); child.setTag(position,mRightVIEwIndex); addAndMeasureChild(child,-1); rightEdge += child.getMeasureDWIDth(); // if(mRightVIEwIndex == mAdapter.getCount()-1) {// mMaxX = mCurrentX + rightEdge - getWIDth();// }// // if (mMaxX < 0) {// mMaxX = 0;// } mRightVIEwIndex++; } } private voID fillListleft(int leftEdge,final int dx) { //&& mleftVIEwIndex >= 0 while (leftEdge + dx > 0) { if (mleftVIEwIndex <= -1) { mleftVIEwIndex = mAdapter.getCount() - 1; } VIEw child = mAdapter.getVIEw(mleftVIEwIndex,mleftVIEwIndex); addAndMeasureChild(child,0); leftEdge -= child.getMeasureDWIDth(); mleftVIEwIndex--; mdisplayOffset -= child.getMeasureDWIDth(); } } private voID removeNonVisibleItems(final int dx) { VIEw child = getChildAt(0); while (child != null && child.getRight() + dx <= 0) { mdisplayOffset += child.getMeasureDWIDth(); mRemovedVIEwQueue.offer(child); removeVIEwInLayout(child); mleftVIEwIndex++; if (mleftVIEwIndex >= mAdapter.getCount()) { mleftVIEwIndex = 0; } child = getChildAt(0); } child = getChildAt(getChildCount() - 1); while (child != null && child.getleft() + dx >= getWIDth()) { mRemovedVIEwQueue.offer(child); removeVIEwInLayout(child); mRightVIEwIndex--; if (mRightVIEwIndex <= -1) { mRightVIEwIndex = mAdapter.getCount() - 1; } child = getChildAt(getChildCount() - 1); } } private voID positionItems(final int dx) { if (getChildCount() > 0) { mdisplayOffset += dx; int left = mdisplayOffset; for (int i = 0; i < getChildCount(); i++) { VIEw child = getChildAt(i); getChildAt(2).setBackground(null); int chilDWIDth = child.getMeasureDWIDth(); child.layout(left,left + chilDWIDth,child.getMeasuredHeight()); left += chilDWIDth + child.getpaddingRight(); } } } public synchronized voID scrollTo(int x) { mScroller.startScroll(mNextX,x - mNextX,0); requestLayout(); } @OverrIDe public boolean dispatchtouchEvent(MotionEvent ev) { boolean handled = super.dispatchtouchEvent(ev); handled |= mGesture.ontouchEvent(ev); switch (ev.getAction()) { case MotionEvent.ACTION_UP: scrollerFalg2 = true; requestLayout(); break; default: break; } return handled; } protected boolean onFling(MotionEvent e1,MotionEvent e2,float veLocityX,float veLocityY) { synchronized (HorizontalScrollSelectVIEw.this) { //mNextX mScroller.fling(mNextX,(int) -veLocityX,Integer.MIN_VALUE,mMaxX,0); } requestLayout(); scrollerFalg1 = true; return true; } protected boolean onDown(MotionEvent e) { mScroller.forceFinished(true); return true; } public interface OnScrollListener { /** * 互动过程中选中的item * * @param position */ public voID onScrollSelectItem(VIEwGroup vIEwGroup,int position); } private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { @OverrIDe public boolean onDown(MotionEvent e) { return HorizontalScrollSelectVIEw.this.onDown(e); } @OverrIDe public boolean onFling(MotionEvent e1,float veLocityY) { return HorizontalScrollSelectVIEw.this.onFling(e1,e2,veLocityX,veLocityY); } @OverrIDe public boolean onScroll(MotionEvent e1,float distanceX,float distanceY) { synchronized (HorizontalScrollSelectVIEw.this) { mNextX += (int) distanceX; } requestLayout(); scrollerFalg1 = false; scrollerFalg2 = false; return true; } @OverrIDe public voID onShowPress(MotionEvent e) { super.onShowPress(e); } @OverrIDe public boolean onSingleTapUp(MotionEvent e) { Log.e("onSingleTapUp","mleftVIEwIndex" + (mleftVIEwIndex + 1));// scrollerFalg=true; return super.onSingleTapUp(e); } @OverrIDe public boolean onSingleTapConfirmed(MotionEvent e) { for (int i = 0; i < getChildCount(); i++) { VIEw child = getChildAt(i); if (isEventWithinVIEw(e,child)) { if (mOnItemClicked != null) { mOnItemClicked.onItemClick(HorizontalScrollSelectVIEw.this,child,mleftVIEwIndex + 1 + i,mAdapter.getItemID(mleftVIEwIndex + 1 + i)); } if (mOnItemSelected != null) { mOnItemSelected.onItemSelected(HorizontalScrollSelectVIEw.this,mAdapter.getItemID(mleftVIEwIndex + 1 + i)); } break; } } return true; } @OverrIDe public voID onLongPress(MotionEvent e) { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { VIEw child = getChildAt(i); if (isEventWithinVIEw(e,child)) { if (mOnItemLongClicked != null) { mOnItemLongClicked.onItemLongClick(HorizontalScrollSelectVIEw.this,mAdapter.getItemID(mleftVIEwIndex + 1 + i)); } break; } } } private boolean isEventWithinVIEw(MotionEvent e,VIEw child) { Rect vIEwRect = new Rect(); int[] childposition = new int[2]; child.getLocationOnScreen(childposition); int left = childposition[0]; int right = left + child.getWIDth(); int top = childposition[1]; int bottom = top + child.getHeight(); vIEwRect.set(left,bottom); return vIEwRect.contains((int) e.getRawX(),(int) e.getRawY()); } };
demo截图:
源码下载:android view实现横向滑动选择
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:Android实现滑动选择控件实例代码Android自定义View实现左右滑动选择出生年份 总结以上是内存溢出为你收集整理的android view实现横向滑动选择全部内容,希望文章能够帮你解决android view实现横向滑动选择所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)