仿时光相册里列表滚动条


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>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值