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;}@Overridepublic void setOnItemSelectedListener(OnItemSelectedListener listener) {mOnItemSelected = listener;}@Overridepublic void setOnItemClickListener(OnItemClickListener listener) {mOnItemClicked = listener;}@Overridepublic void setOnItemLongClickListener(OnItemLongClickListener listener) {mOnItemLongClicked = listener;}/*** 設置選中狀態時的圖片** @param mDrawable*/public void setSelectBitmap(Drawable mDrawable) {this.mDrawable = mDrawable;}private DataSetObserver mDataObserver = new DataSetObserver() {@Overridepublic void onChanged() {synchronized (HorizontalScrollSelectView.this) {mDataChanged = true;}invalidate();requestLayout();}@Overridepublic void onInvalidated() {reset();invalidate();requestLayout();}};@Overridepublic ListAdapter getAdapter() {return mAdapter;}@Overridepublic View getSelectedView() {//TODO: implementreturn null;}@Overridepublic void setAdapter(ListAdapter adapter) {if (mAdapter != null) {mAdapter.unregisterDataSetObserver(mDataObserver);}mAdapter = adapter;mAdapter.registerDataSetObserver(mDataObserver);reset();}private synchronized void reset() {initView();removeAllViewsInLayout();requestLayout();}@Overridepublic void setSelection(int position) {//TODO: implementint 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")@Overrideprotected 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() {@Overridepublic 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 >= 0while (leftEdge + dx > 0) {if (mLeftViewIndex <= -1) {mLeftViewIndex = mAdapter.getCount() - 1;}View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);child.setTag(position, 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, 0, left + childWidth, child.getMeasuredHeight());left += childWidth + child.getPaddingRight();}}}public synchronized void scrollTo(int x) {mScroller.startScroll(mNextX, 0, x - mNextX, 0);requestLayout();}@Overridepublic 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) {//mNextXmScroller.fling(mNextX, 0, (int) -velocityX, 0, Integer.MIN_VALUE, mMaxX, 0, 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() {@Overridepublic boolean onDown(MotionEvent e) {return HorizontalScrollSelectView.this.onDown(e);}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {return HorizontalScrollSelectView.this.onFling(e1, e2, velocityX, velocityY);}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {synchronized (HorizontalScrollSelectView.this) {mNextX += (int) distanceX;}requestLayout();scrollerFalg1 = false;scrollerFalg2 = false;return true;}@Overridepublic void onShowPress(MotionEvent e) {super.onShowPress(e);}@Overridepublic boolean onSingleTapUp(MotionEvent e) {Log.e("onSingleTapUp", "mLeftViewIndex" + (mLeftViewIndex + 1));
//			scrollerFalg=true;return super.onSingleTapUp(e);}@Overridepublic 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, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i));}break;}}return true;}@Overridepublic 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, child, mLeftViewIndex + 1 + i, 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, top, right, bottom);return viewRect.contains((int) e.getRawX(), (int) e.getRawY());}};</span>
demo截圖:


demo地址:http://download.csdn.net/detail/s569646547/9070919


版權聲明:本文為博主原創文章,未經博主允許不得轉載。

轉載于:https://www.cnblogs.com/s569646547/p/4784664.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

適用于Mac OS X的官方Java 7 –狀態

希望到現在&#xff0c;每個人都知道蘋果公司去年加入了OpenJDK項目。 這意味著什么&#xff1f; 蘋果將??把用于私有Mac Java構建的代碼作為GPL代碼貢獻給OpenJDK 甲骨文將接管Java的Mac端口 隨著時間的流逝&#xff0c;Mac平臺將成為Java世界中完全一流的公民 對于想要在…

excel使用教程_數據分析Excel必備技能:數據透視表使用教程

江米小棗tonylua | 作者掘金 | 來源處理數量較大的數據時&#xff0c;一般分為數據獲取、數據篩選&#xff0c;以及結果展示幾個步驟。在 Excel 中&#xff0c;我們可以利用數據透視表(Pivot Table)方便快捷的實現這些工作。本文首先手把手的教你如何在 Excel 中手動構建一個基…

.典型用戶 - 場景

典型用戶&#xff1a; 名字黃德勝性別、年齡男&#xff0c;35歲職業自由投資人收入20萬元/年知識層次和能力專科&#xff0c;有一定的投資經驗&#xff0c;對經濟有自己的看法生活/工作情況已婚&#xff0c;生活負擔在加重動機&#xff0c;目的&#xff0c;困難想要增加收入&am…

java調用webservice_篤學私教:Java開發網站架構演變過程-從單體應用到微服務架構詳解...

原標題&#xff1a;篤學私教&#xff1a;Java開發網站架構演變過程-從單體應用到微服務架構詳解Java開發網站架構演變過程&#xff0c;到目前為止&#xff0c;大致分為5個階段&#xff0c;分別為單體架構、集群架構、分布式架構、SOA架構和微服務架構。下面玄武老師來給大家詳細…

再把你的錢加倍

總覽 很久以前&#xff0c;我寫了一篇關于用雙倍賺錢的文章。 但是&#xff0c;當解決方案相當簡單時&#xff0c;仍然是許多開發人員普遍擔心的問題。 用雙倍賺錢的問題 double有兩種類型的錯誤。 它存在表示錯誤。 即&#xff0c;它不能完全代表所有可能的十進制值。 即使0…

單元測試中Assert類的用法

Assert類所在的命名空間為Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll就可以使用了&#xff0c; 在這里我會舉例說明Assert里面的一些主要的靜態成員。 1、 AreEqual&#xff1a;方法被重載…

CocoaPods安裝使用

$ gem sources --remove https://rubygems.org/ //等有反應之后再敲入以下命令 $ gem sources -a http://ruby.taobao.org/*** CURRENT SOURCES ***http://ruby.taobao.org/ //出現這個說明安裝正確$ sudo gem install cocoapods 安裝cocoaPods到項目的路徑下 $ touch Pod…

303. 區域和檢索 - 數組不可變(數組前綴和知識應用)

給定一個整數數組 nums&#xff0c;處理以下類型的多個查詢: 計算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之間的 nums 元素的 和 &#xff0c;其中 left < right 實現 NumArray 類&#xff1a; NumArray(int[] nums) 使用數組 nums 初始化對象 in…

pat1049. Counting Ones (30)

1049. Counting Ones (30) 時間限制10 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, YueThe task is simple: given any positive integer N, you are supposed to count the total number of 1s in the decimal form of the integers from 1 to N. For ex…

加油站會員管理系統源碼php_加油站使用會員管理系統,如何解決行業瓶頸?

隨著人們生活條件的不斷改善&#xff0c;基本上家家戶戶都有了私家車輛&#xff0c;這對于加油站而言&#xff0c;覆蓋的客戶量也逐漸增多。現在很多加油站還是處于比較傳統的收銀模式和會員營銷管理模式&#xff0c;收銀效率低&#xff0c;客戶得不到全方面的管理。尤其是在高…

專2-第二課 Eclipse開發環境搭建

2.1下載Eclipse 2.2 安裝C/C版本的Eclipse 2.3 安裝JDT插件開發Java程序 2.4 使用Eclipse開發驅動程序 既然安裝了eclipse來進行驅動學習&#xff0c;那么我們就先來試試看eclipse開發驅動的大致流程。這里以Linux設備驅動作為示列給讀者展示整個流程&#xff0c;Android底層的…

使用JAXB從XSD生成XML

這是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla發表的帖子。 Mohamed解釋了如何使用JAXB從給定的XSD生成XML 。 &#xff08;注意&#xff1a;對原始帖子進行了少量編輯以提高可讀性&#xff09; 我們可以使用JAXB使用給定的Schema將Java對象編組為XML&#…

tkinter 菜單添加事件_Tasker的最新測試劫持了Android 11的電源菜單

流行的Android自動化應用Tasker 最近收到了重大更新&#xff0c;為該應用引入了許多新功能。該更新包括解鎖應用程序讀取手機上任何傳感器以觸發任務的功能&#xff0c;使您可以通過任何第三方應用程序自動發送短信或撥打電話的功能&#xff0c;完全請勿打擾自定義功能。通過鏈…

CLR via C#(18)——Enum

1. Enum定義 枚舉類型是經常用的一種“名稱/值”的形式&#xff0c;例如&#xff1a; public enum FeedbackStatus { New, Processing, Verify, Closed } 定義枚舉類型之后我們在使用時方便了許多&#xff0c;不用再記著0代表什么狀態…

PHP中 magic_quotes_gpc 和 magic_quotes_runtime 區別及其反斜線轉義問題

php中關于反斜線轉義&#xff1a;php中數據的魔法引用函數 magic_quotes_gpc 或 magic_quotes_runtime 設置為on時&#xff0c;當數據遇到 單引號 和 雙引號" 以及 反斜線\ NULL時自動加上反斜線&#xff0c;進行自動轉義。注釋&#xff1a;默認情況下&#xff0c;PH…

JDK中的設計模式

Zen的JCG合作伙伴Brian Du Preez 是IT藝術領域的合作伙伴&#xff0c;他在收集JDK中最常見的設計模式方面做得非常出色。 模式列表確實令人印象深刻且很長&#xff0c;所以讓我們不再ba不休&#xff0c;向您展示它。 前幾天&#xff0c;我在企業Dev中看到了Rob Williams Brain …

414. 第三大的數

給你一個非空數組&#xff0c;返回此數組中 第三大的數 。如果不存在&#xff0c;則返回數組中最大的數 方法一 首先將數組排序&#xff0c;然后通過集合去除重復的元素&#xff0c;最后進行一次判斷&#xff0c;選擇第三大元素還是最大元素 class Solution {public int thir…

bufferevent 與 socket

http://blog.sina.com.cn/s/blog_56dee71a0100qx4s.html 很多時候&#xff0c;除了響應事件之外&#xff0c;應用還希望做一定的數據緩沖。比如說&#xff0c;寫入數據的時候&#xff0c;通常的運行模式是&#xff1a; l 決定要向連接寫入一些數據&#xff0c;把數據放入到緩沖…

Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解

A. Help Farmer題目連接&#xff1a; http://www.codeforces.com/contest/142/problem/A Description Once upon a time in the Kingdom of Far Far Away lived Sam the Farmer. Sam had a cow named Dawn and he was deeply attached to her. Sam would spend the whole summe…

電力電子、電機控制系統的建模和仿真_清華團隊研發,首款國產電力電子仿真軟件來啦~已捐贈哈工大、海工大、清華使用!...

點擊上方電氣小青年&#xff0c;關注并星標由于微信改版&#xff0c;只有星標才能及時看到我們的消息哦━━━━━━推薦閱讀&#xff1a;《膜拜大神&#xff01;清華大學電機系2021年接收推薦免試直碩(博)生擬錄取名單公示&#xff01;》《滴滴程序員年薪80萬被鄙視不如在二本…