
自定义的seekBar(二)
发布日期:2021-05-09 18:26:47
浏览次数:8
分类:精选文章
本文共 8544 字,大约阅读时间需要 28 分钟。
因为很多时候seekbar并不能满足我们开发的需求,这里我们需要自定义的seekbar
上效果图,图片如下,很多人有疑问,为什么这个自定义的看起来比系统自带的效果也好不类多少,为什么还需要自定义呢,很简单,自定义可以控制很多属性,实现一些系统控件无法实现的效果,更关键的时帮助你理解源码,自定义写多了自然就会写了,这是一个长期积累的过程,大家坚持住,自定义控件不是一朝一夕能学会的,注意积累
(1)首先我们在text.xml中来定义控件,注意控件的包名
(2)在drawable里面新建一个chs_mhs_seekbar_thumb.xml,这个用于设置进度条上面拖动条的图片
(3)在values文件夹里面新建attrs.xml
(4)color资源,应该都知道放哪里吧
#FFffffff #FF9B3A #FF262c37
(5)自定义的seekbar 新建MHS_SeekBar
package com.example.administrator.testz;/** * Created by Administrator on 2018\7\30 0030. */ import android.R.color; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View;public class MHS_SeekBar extends View { private final boolean DEBUG = false; private final String TAG = "MHS_SeekBar"; private Context mContext = null; private AttributeSet mAttrs = null; private Drawable mThumbDrawable = null; private int mThumbHeight = 0; private int mThumbWidth = 0; private int[] mThumbNormal = null; private int[] mThumbPressed = null; private boolean CanTouch=true; private boolean ThumbTouch=false; private float mSeekBarMax = 0; private float mThumbX = 0; private float mThumbY = 0; private Paint mhsSeekBarBackgroundPaint = null; private Paint mhsSeekbarProgressPaint = null; private RectF RectF_mhsbg = null; private RectF RectF_mhsprogress = null; private float mhsSeekbarLong=0; private int mhsSeekbarWidth=0; private int mhsSeekbarRound=0; private float mhsprogress_set = 0; private int sb_left=0; private int sb_top=0; private int sb_right=0; private int sb_bottom=0; private int mViewHeight = 0; private int mViewWidth = 0; //private int mSeekBarCenterX = 0; private int mSeekBarCenterY = 0; private int mCurrentProgress = 0; private int old_mCurrentProgress = 0; /*�¼����� */ private OnMSBSeekBarChangeListener mOnMSBSeekBarChangeListener=null; public MHS_SeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; mAttrs = attrs; initView(); } public MHS_SeekBar(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mAttrs = attrs; initView(); } public MHS_SeekBar(Context context) { super(context); mContext = context; initView(); } private void initView(){ if(DEBUG) Log.d(TAG, "initView"); TypedArray localTypedArray = mContext.obtainStyledAttributes(mAttrs, R.styleable.mhsb_seekbar); //thumb��������ʹ��android:thumb���Խ������õ� //���ص�DrawableΪһ��StateListDrawable���ͣ�������ʵ��ѡ��Ч����drawable list //mThumbNormal��mThumbPressed�����������ò�ͬ״̬��Ч���������thumbʱ����mThumbPressed����������mThumbNormal mThumbDrawable = localTypedArray.getDrawable(R.styleable.mhsb_seekbar_android_thumb); mThumbWidth = this.mThumbDrawable.getIntrinsicWidth(); mThumbHeight = this.mThumbDrawable.getIntrinsicHeight(); mThumbNormal = new int[]{-android.R.attr.state_focused, -android.R.attr.state_pressed, -android.R.attr.state_selected, -android.R.attr.state_checked}; mThumbPressed = new int[]{android.R.attr.state_focused, android.R.attr.state_pressed, android.R.attr.state_selected, android.R.attr.state_checked}; localTypedArray.getDimension(R.styleable.mhsb_seekbar_mhs_progress_width, 5); mhsSeekbarWidth = (int) localTypedArray.getDimension(R.styleable.mhsb_seekbar_mhs_progress_width, 5); mhsSeekbarRound = (int) localTypedArray.getDimension(R.styleable.mhsb_seekbar_mhs_progress_bar_round, 4); int progressBackgroundColor = localTypedArray.getColor(R.styleable.mhsb_seekbar_mhs_progress_background_color, color.darker_gray); int progressFrontColor = localTypedArray.getColor(R.styleable.mhsb_seekbar_mhs_progress_color, getResources().getColor(R.color.text_color_xoverset)); mSeekBarMax = localTypedArray.getInteger(R.styleable.mhsb_seekbar_mhs_progress_max, 60); //---- mhsSeekBarBackgroundPaint = new Paint(); mhsSeekbarProgressPaint = new Paint(); mhsSeekBarBackgroundPaint.setColor(progressBackgroundColor); mhsSeekbarProgressPaint.setColor(progressFrontColor); mhsSeekBarBackgroundPaint.setAntiAlias(true); mhsSeekbarProgressPaint.setAntiAlias(true); localTypedArray.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); setMeasuredDimension(width, height); super.onMeasure(widthMeasureSpec, heightMeasureSpec); if(DEBUG) Log.d(TAG, "onMeasure"); mViewWidth = width;//getWidth(); mViewHeight = height;//getHeight(); //mSeekBarCenterX = mViewWidth / 2; mSeekBarCenterY = mViewHeight / 2; //mhsSeekbarLong = mViewWidth-mThumbWidth; mhsSeekbarLong = mViewWidth-mThumbWidth*2; //seekbar chs_progress and bar start point and stop point //sb_left=mThumbWidth/2; sb_left=mThumbWidth; sb_top=mSeekBarCenterY-mhsSeekbarWidth/2; sb_right=(int) (sb_left+mhsSeekbarLong); sb_bottom=mSeekBarCenterY+mhsSeekbarWidth/2; //seekbar chs_progress mhsprogress_set= mhsSeekbarLong/mSeekBarMax*mCurrentProgress; //draw Rect seekbar bg RectF_mhsbg = new RectF(sb_left,sb_top,sb_right,sb_bottom); //draw Rect seekbar chs_progress RectF_mhsprogress = new RectF(sb_left,sb_top,mhsprogress_set,sb_bottom); //seekbar Thumb mThumbX=mhsprogress_set + mThumbWidth/2; mThumbY=mSeekBarCenterY-mThumbHeight/2; if(DEBUG) System.out.println("MHS mViewWidth:"+mViewWidth); if(DEBUG) System.out.println("MHS mViewHeight:"+mViewHeight); } @Override protected void onDraw(Canvas canvas) { int p_top=(int) (mhsprogress_set+mThumbWidth);// int top=sb_top-mhsSeekbarWidth/2;// int bottom=sb_bottom+mhsSeekbarWidth/2;// RectF_mhsprogress = new RectF(sb_left,top,p_top,bottom); RectF_mhsprogress = new RectF(sb_left,sb_top,p_top,sb_bottom); //±³¾°£¬½ø¶È£¬½¹µã canvas.drawRoundRect(RectF_mhsbg, mhsSeekbarRound, mhsSeekbarRound, mhsSeekBarBackgroundPaint); canvas.drawRoundRect(RectF_mhsprogress, mhsSeekbarRound, mhsSeekbarRound, mhsSeekbarProgressPaint); drawThumbBitmap(canvas); //drawProgressText(canvas); super.onDraw(canvas); } private void drawThumbBitmap(Canvas canvas) { this.mThumbDrawable.setBounds((int) mThumbX, (int) mThumbY, (int) (mThumbX + mThumbWidth), (int) (mThumbY + mThumbHeight)); this.mThumbDrawable.draw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { if(!CanTouch){ return true; } float eventX = event.getX(); float eventY = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //Log.v(TAG, "MHS ACTION_DOWN eventX = " + eventX); if(((eventX+mThumbWidth/4)>mThumbX)&&((eventX-mThumbWidth)
(6)只剩下监听事件了
public class MainActivity extends AppCompatActivity { private MHS_SeekBar VSB_Master; private TextView tv_main; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); VSB_Master = (MHS_SeekBar) findViewById(R.id.id_sbi_0); tv_main = (TextView)findViewById(R.id.tv_main); VSB_Master.setOnSeekBarChangeListener(new MHS_SeekBar.OnMSBSeekBarChangeListener() { @Override public void onProgressChanged(MHS_SeekBar mcSeekBar, int progress, boolean fromUser) { tv_main.setText(String.valueOf(progress)); } }); }}
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月24日 04时22分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
数据库事务的四大特性
2021-05-09
[Maven]构建配置文件
2021-05-09
[Maven]配置文件
2021-05-09
【OAuth2】Spring Security OAuth2 源码分析
2021-05-09
[MySQL] error 1292 数据类型错误
2021-05-09
socket长连接所用到的八大技术
2021-05-09
gitignore_global设置
2021-05-09
Taro学习手册(四)—— Taro的样式尺寸
2021-05-09
photon磁力下载工具
2021-05-09
国家反诈中心|国家反诈中心官方app
2021-05-09
文本框通过按键获取焦点
2021-05-09
表单提交时利用location获取URL参数并显示用户名
2021-05-09
C++继承中构造和析构顺序
2021-05-09
C++继承同名成员处理方式
2021-05-09
高等数学上-赵立军-北京大学出版社-题解-练习2.3
2021-05-09
高等数学上-赵立军-北京大学出版社-题解-练习4.3
2021-05-09
LeetCode 1122 数组的相对排序-简单-unordered_map容器的应用
2021-05-09
LeetCode 637 二叉树的层平均值-简单
2021-05-09
Java虚拟机结构(内存,类加载器,执行引擎)
2021-05-10