仿时光相册里列表滚动条
来源:互联网 发布:mysql like语句 编辑:程序博客网 时间:2024/05/19 13:16
1.点击显示当前显示日期;
2.放手则收缩,过三秒自动隐藏。
控件代码如下
ScrollFloatBar.java
public class ScrollFloatBar extends FrameLayout { private static final String TAG = "ScrollFloatBar"; private IScrollClick listener; private boolean isAllowTouch = true; private int minY; private int maxY; private int mCurY; private View mContentView; private Activity mContext; public ScrollFloatBar(Activity context, int minY, int maxY, int layoutres){ super(context); mContext = context; mContentView = LayoutInflater.from(getContext()).inflate(layoutres, null); this.minY = minY; this.maxY = maxY; // init(mContentView, minY); if (mContentView != null) { addView(mContentView); } DLog.d(TAG, "minY:" + this.minY); DLog.d(TAG, "this.maxY:" + this.maxY); } public void updateConfig(int minY, int maxY){ this.minY = minY; this.maxY = maxY; } private void init(View childView, int y) { } /** * 更新位置 * * @param y */ public void updateFloatViewPosition(int y) { mCurY = y; if (mCurY >= maxY) { mCurY = maxY; } else if (mCurY <= minY) { mCurY = minY; } DLog.d("updateFloatViewPosition", "mCurY:" + mCurY); setY(mCurY); } /** * 更新位置 * * @param y */ public void updateFloatViewPosition(int y, boolean isEnd) { if (isEnd) { mCurY = maxY; DLog.d(TAG, "updateFloatViewPosition isEnd:" + isEnd); } else { mCurY = y + minY; } updateFloatViewPosition(mCurY); } public void setScrollBarClickListener(IScrollClick listener) { this.listener = listener; } /** * 添加至窗口 * * @return */ public boolean addToWindow() { ViewGroup decorView = (ViewGroup) mContext.getWindow().getDecorView(); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.RIGHT; decorView.addView(this, params); InitComplete(); return true; } private void InitComplete() { this.post(new Runnable(){ @Override public void run() { DLog.d(TAG, "getMeasuredHeight:" + getMeasuredHeight() + " getMeasuredWidth:" + getMeasuredWidth()); maxY -= getMeasuredHeight(); } }); } public void setIsAllowTouch(boolean flag) { isAllowTouch = flag; } /** * 从窗口移除 * * @return */ public boolean removeFromWindow() { return false; } public void setDate(String Date) { if (TextUtils.isEmpty(Date)) { return; } String[] dateTime = Date.split("-"); if (dateTime.length >= 1 && dateTime[0] != null) { TextView year = (TextView) mContentView.findViewById(R.id.year); year.setText(dateTime[0] + "年"); } if (dateTime.length >= 2 && dateTime[1] != null) { TextView month = (TextView) mContentView.findViewById(R.id.month); month.setText(dateTime[1] + "月"); } if (dateTime.length >= 3 && dateTime[2] != null) { TextView day = (TextView) mContentView.findViewById(R.id.day); day.setText(dateTime[2] + "日"); } } // 此wmParams为获取的全局变量,用以保存悬浮窗口的属性 // 重写,返回true 拦截触摸事件 // @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub return isAllowTouch; } @Override public boolean onTouchEvent(MotionEvent event) { DLog.d(TAG, "minY:" + minY); DLog.d(TAG, "this.maxY:" + this.maxY); int y; // 高度为rectangle.top-0仍为rectangle.top switch (event.getAction()) { case MotionEvent.ACTION_DOWN: y = (int) event.getRawY() - this.getMeasuredHeight() / 2; DLog.d(TAG, "y:" + y); if (listener != null) { listener.onScrollBarDown(); } updateFloatViewPosition(y); return true; case MotionEvent.ACTION_MOVE: // 减25为状态栏的高度 y = (int) event.getRawY() - this.getMeasuredHeight() / 2; DLog.d(TAG, "y:" + y); DLog.d(TAG, "event.getRawY:" + event.getRawY()); // 刷新 if (y >= minY && y <= maxY) { DLog.d(TAG, "ACTION_MOVE wmParams.y:" + mCurY); updateFloatViewPosition(y); int minYB = mCurY - minY; if (listener != null) { listener.onScrollBarMove(minYB); } } else { DLog.d(TAG, "else ACTION_MOVE"); } return true; case MotionEvent.ACTION_UP: if (listener != null) { listener.onScrollBarUp(); } DLog.d(TAG, " MotionEvent.ACTION_UP"); return true; default: break; } return false; } public int getFloatViewY() { return mCurY; } public interface IScrollClick { void onScrollBarDown(); void onScrollBarMove(int y); void onScrollBarUp(); }}
控制滚动条
public class ListViewScrollBar { private static final String TAG = "ListViewScrollBar"; private static final int DIMISS_SCROLLBAR = 3 * 1000; private ArrayList<String> mDateArrays = new ArrayList<String>(); private ArrayList<Integer> mPositonArrays = new ArrayList<Integer>(); private ScrollFloatBar mTimeScrollBar; private IScrollLisner mScrollListner; private int mListHeigh; private boolean mIsTouchScrollMode = false; private ScrollFloatBar.IScrollClick mFloatViewListner = new ScrollFloatBar.IScrollClick(){ @Override public void onScrollBarDown() { mIsTouchScrollMode = true; setmTimeScrollBarVisibility(true); if (mScrollListner != null) { mScrollListner.onTouchDown(); } } @Override public void onScrollBarMove(int y) { DLog.d(TAG, "onScrollBarMove y--->" + y); String date = null; mIsTouchScrollMode = true; if (mDateArrays.size() > 0) { int index = (int) (y * mDateArrays.size() / mListHeigh); DLog.d(TAG, "onScrollBarMove mDateArrays size:" + mDateArrays.size()); DLog.d(TAG, "onScrollBarMove mListHeigh--->mListHeigh:" + mListHeigh); DLog.d(TAG, "onScrollBarMove index--->index:" + index); if (index >= 0 && index < mDateArrays.size()) { date = mDateArrays.get(index); mTimeScrollBar.setDate(date); } } if (mScrollListner != null) { mScrollListner.onTouchMove(date); } } @Override public void onScrollBarUp() { setScrollBarVisibility(true); if (mScrollListner != null) { mScrollListner.onTouchUp(); } DLog.d(TAG, "onScrollBarUp"); mHandler.sendEmptyMessageDelayed(1, 500); } }; public boolean canScrollStateChanged(int scrollState) { if (mTimeScrollBar != null && mIsTouchScrollMode && scrollState == SCROLL_STATE_IDLE) { return true; } return false; } public void setScrollBarPosition(int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (mIsTouchScrollMode || mTimeScrollBar == null) { return; } int y = -1; setScrollBarVisibility(true); if (firstVisibleItem + visibleItemCount == totalItemCount) { mTimeScrollBar.updateFloatViewPosition(y, true); DLog.d(TAG, "setScrollBarPosition firstVisibleItem + visibleItemCount == totalItemCount"); return; } else if (firstVisibleItem == 0) { DLog.d(TAG, "setScrollBarPosition firstVisibleItem == 0"); y = 0; } else { int index = mPositonArrays.indexOf(firstVisibleItem); if (index != -1) { y = index * mListHeigh / mDateArrays.size(); DLog.d(TAG, "setScrollBarPosition index = " + index); DLog.d(TAG, "setScrollBarPosition firstVisibleItem:" + firstVisibleItem + "visibleItemCount:" + visibleItemCount + " setScrollBarPosition y :" + y); } else { DLog.d(TAG, "setScrollBarPosition index == -1"); } } if (y != -1) { DLog.d(TAG, "y:" + y); mTimeScrollBar.updateFloatViewPosition(y, false); } } public void setDate(Map<String, Integer> DatePosition) { if (DatePosition.size() != mDateArrays.size()){ mDateArrays = new ArrayList<String>(DatePosition.keySet()); mPositonArrays = new ArrayList<Integer>(DatePosition.values()); } } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (mTimeScrollBar == null || mTimeScrollBar.isDirty()){ return; } switch (msg.what) { case 0: mTimeScrollBar.findViewById(R.id.scrollbar_rly).setVisibility(View.GONE); mTimeScrollBar.findViewById(R.id.scroll_bar).setVisibility(View.INVISIBLE); DLog.d(TAG, "setScrollBarVisibility handleMessage"); break; case 1: mIsTouchScrollMode = false; break; } } }; public ListViewScrollBar( Activity context, int minY,int listHeight, Map<String, Integer> DatePosition, IScrollLisner listner){ mScrollListner = listner; init(context, minY, listHeight, DatePosition); } public boolean isNeedReInit(){ return mTimeScrollBar == null; } public void init(Activity context, int minY,int listHeight, Map<String, Integer> DatePosition) { if (minY == 0 || DatePosition.size() <= 0 || listHeight == 0){ return; } mDateArrays = new ArrayList<String>(DatePosition.keySet()); mPositonArrays = new ArrayList<Integer>(DatePosition.values()); int maxY = minY + listHeight; mListHeigh = listHeight; mTimeScrollBar = new ScrollFloatBar(context, minY, maxY, R.layout.time_scroll_bar); mTimeScrollBar.setScrollBarClickListener(mFloatViewListner); mTimeScrollBar.addToWindow(); mTimeScrollBar.setIsAllowTouch(true); mTimeScrollBar.setDate(mDateArrays.get(0)); } public void setmTimeScrollBarVisibility(boolean isVisiable) { if (mTimeScrollBar == null) { return; } if (isVisiable) { mTimeScrollBar.findViewById(R.id.scrollbar_rly).setVisibility(View.VISIBLE); mTimeScrollBar.findViewById(R.id.time_scrollbar).setVisibility(View.VISIBLE); mTimeScrollBar.findViewById(R.id.scroll_bar).setVisibility(View.GONE); mHandler.removeCallbacksAndMessages(null); } else { mTimeScrollBar.findViewById(R.id.scroll_bar).setVisibility(View.GONE); } } public void setScrollBarVisibility(boolean isVisiable) { if (mTimeScrollBar == null) { return; } if (isVisiable) { mTimeScrollBar.findViewById(R.id.scrollbar_rly).setVisibility(View.VISIBLE); mTimeScrollBar.findViewById(R.id.scroll_bar).setVisibility(View.VISIBLE); mTimeScrollBar.findViewById(R.id.time_scrollbar).setVisibility(View.GONE); mHandler.removeCallbacksAndMessages(null); mHandler.sendEmptyMessageDelayed(0, DIMISS_SCROLLBAR); } else { mTimeScrollBar.findViewById(R.id.scroll_bar).setVisibility(View.GONE); } } public void setGone() { mHandler.removeCallbacksAndMessages(null); if (mTimeScrollBar == null){ return; } mTimeScrollBar.findViewById(R.id.scrollbar_rly).setVisibility(View.GONE); setScrollBarVisibility(false); setmTimeScrollBarVisibility(false); } public interface IScrollLisner { void onTouchDown(); void onTouchMove(String date); void onTouchUp(); }}
xml
R.layout.time_scroll_bar
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollbar_rly" android:layout_width="wrap_content" android:layout_height="wrap_content"> <RelativeLayout android:id="@+id/time_scrollbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:background="@drawable/scrollbar_press"> <TextView android:id="@+id/month" android:layout_marginLeft="16dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="12月" android:textColor="#FF000000" android:textSize="24sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerVertical="true" android:layout_toRightOf="@+id/month" android:layout_toEndOf="@+id/month"> <TextView android:id="@+id/year" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2017年" android:textColor="#FF000000" android:textSize="10sp" /> <TextView android:id="@+id/day" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="17日" android:textColor="#FF000000" android:textSize="10sp" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:id="@+id/scroll_bar" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src = "@drawable/scrollbar_normal"/> </RelativeLayout></RelativeLayout>
阅读全文
0 0
- 仿时光相册里列表滚动条
- 仿滚动条
- js仿滚动条
- CDialog里的滚动条
- HTML自定义滚动条(仿网易邮箱滚动条)
- BCB 列表框 滚动条
- bootstrap列表添加滚动条
- 高仿《今日头条》滚动TitleBar
- Android仿淘宝滚动的头条
- Android仿淘宝滚动的头条
- 仿 Google Reader 随滚动条滚动加载页面效果
- 仿 Google Reader 随滚动条滚动加载页面效果
- html仿今日头条数据列表
- 高仿今日头条顶部渐变滚动条
- C#里滚动条的应用
- 关于QTableWidget里的滚动条问题
- Android【垂直滚动广告条】仿淘宝头条1号店京东—垂直滚动广告条
- Android【垂直滚动广告条】仿淘宝头条1号店京东—垂直滚动广告条
- Pangolin compiled with VS2013 on Windows 7
- Qt中的对话框
- 53. Maximum Subarray
- SpringMVC验证框架Validation分组验证
- java设计模式之单例模式
- 仿时光相册里列表滚动条
- Kotlin一周总结
- hdu 1023 Train Problem II(Catlan数)
- Head First设计模式 读书笔记01 策略模式(Ruby代码实现)
- android开发四种引用的详解
- TTL电平与RS232电平的区别
- 前端小结--ajax和spring互传json对象,并显示到列表中
- REST与RESTFul API最佳实践
- 图的遍历(上)——邻接矩阵表示