仿时光相册里列表滚动条

来源:互联网 发布: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>




原创粉丝点击