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

这篇博客分享了一段自定义垂直滚动条的Android代码实现,包括背景图片、滑块尺寸设置,以及滑动事件处理。作者通过重写View类并实现了触摸事件监听,当滑块在顶部或底部时,进度分别设置为最大值和0。此外,还提供了进度改变的回调接口供外部使用。
摘要由CSDN通过智能技术生成

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

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);     } }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值