android自定义View之垂直的滚动条

  以前项目里面做过一个垂直的滚动条,拿过来改了改,做了一个垂直的滚动条,不多说,贴代码。




package com.my.example;
import com.my.example.R
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class VerticalSeekBar extends View {
    private final static String TAG = "VerticalSeekBar";
    // 要画的图片
    private Drawable mBackGroud;
    private Drawable mThumb;
    // 背景
    private int m_nBackGroudWidth;
    private int m_nBackGroudHeight;
    // 滑块
    private int m_nThumbHeight;
    private int m_nThumbWidth;
    // 滚动条高度,当滑块在最低端时,这时进度应该是0,所以滚动条高度应该是背景高度减去滑块高度
    private int m_nSeekBarHeight;
    private int m_nThumbLeft; // 滑块里父元素左边的距
    private int m_nThumbTop; // 滑块离顶部距
    private int m_nProgress; // 当前的进度
    private int m_nMax=100; //最大值,一般从0开始
    private OnVerticalSeekBarChangeListener mListener;
    public interface OnVerticalSeekBarChangeListener{
        
        void onProgressChanged(VerticalSeekBar verticalSeekBar, int progress);
        
    }
    public VerticalSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);


        mBackGroud = context.getResources().getDrawable(R.drawable.poker_seekbar_bg);
        int intrinsicHeight = mBackGroud.getIntrinsicHeight();
        int intrinsicWidth = mBackGroud.getIntrinsicWidth();
        mThumb = context.getResources().getDrawable(R.drawable.poker_seekbar_bg);

        // 物理像素,屏幕上显示的宽度和高度
        m_nBackGroudWidth = (int) getResources().getDimension(R.dimen.vertical_seekbar_bg_width);
        m_nBackGroudHeight = (int) getResources().getDimension(R.dimen.vertical_seekbar_bg_height);

        m_nThumbWidth = (int) getResources().getDimension(R.dimen.vertical_seekbar_thumb_width);
        m_nThumbHeight = (int) getResources().getDimension(R.dimen.vertical_seekbar_thumb_height);
        Log.i(TAG, "m_nThumbWidth=" + m_nThumbWidth + ",m_nThumbHeight=" + m_nThumbHeight);

        m_nSeekBarHeight = m_nBackGroudHeight - m_nThumbHeight;

        m_nThumbLeft = (m_nBackGroudWidth - m_nThumbWidth) / 2;

        // 第一,二个参数是相对于父元素坐标,三四个是宽度和高度
        mBackGroud.setBounds(0, 0, m_nBackGroudWidth, m_nBackGroudHeight);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        // getLeft相对于父元素左边距离,getRight=getLeft+getWidth
        int width = getWidth();
        Log.i(TAG, "width=" + width);
        mBackGroud.draw(canvas);
        mThumb.draw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int Y = (int) event.getY();
        int progress = 0;
        // 这是滑块已经到达顶部
        if (Y <= m_nThumbHeight / 2) {

            progress = m_nMax;
        }
        // 滑块到达最底端
        else if (Y >= (m_nSeekBarHeight + m_nThumbHeight / 2)) {

            progress = 0;
        } else {

            progress = (m_nSeekBarHeight - Y + m_nThumbHeight / 2) * m_nMax / m_nSeekBarHeight;
        }
        refresh(progress);
        return true;
    }

    private void refresh(int progress) {
   
        m_nThumbTop = (m_nMax-progress )* m_nSeekBarHeight / m_nMax; // 把m_nSeekBarHeight分成m_nMax份,progress是当前的份额

        mThumb.setBounds(m_nThumbLeft, m_nThumbTop, m_nThumbLeft + m_nThumbWidth, m_nThumbTop
                + m_nThumbHeight);
        invalidate();
        
        if(mListener!=null){
            
            mListener.onProgressChanged(this, progress);
        }

    }
    public void setListener(OnVerticalSeekBarChangeListener a_Listen) {

        mListener = a_Listen;
    }
   
    public void setMax(int max) {
       
        this.m_nMax=max;
        refresh(0);
    }


}

你可能感兴趣的:(android技术文章)