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>