android 带刻度的滑动条_Android 自定义带刻度的seekbar

自定义带刻度的seekbar

f55d5ebe41de2b048e5733a2659ad2e5.gif

1.布局

android:id="@+id/myCustomSeekBar"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="14.33dp"

android:layout_marginRight="10.33dp" />

2.在activity中使用

private ArrayList volume_sections = new ArrayList();

volume_sections.add("静音");

volume_sections.add("低");

volume_sections.add("中");

volume_sections.add("高");

customSeekBar.initData(volume_sections);

customSeekBar.setProgress(int level);

customSeekBar.setResponseOnTouch(this);//activity实现了下面的接口ResponseOnTouch,每次touch会回调onTouchResponse

public interface ResponseOnTouch {

public void onTouchResponse(int volume);

}

3.自定义seekbar的代码

package com.imibaby.client.views;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.util.TypedValue;

import android.view.MotionEvent;

import android.view.View;

import com.imibaby.client.R;

import com.imibaby.client.interfaces.ResponseOnTouch;

import java.util.ArrayList;

public class CustomSeekbar extends View {

private final String TAG = "CustomSeekbar";

private int width;

private int height;

private int downX = ;

private int downY = ;

private int upX = ;

private int upY = ;

private int moveX = ;

private int moveY = ;

private float scale = ;

private int perWidth = ;

private Paint mPaint;

private Paint mTextPaint;

private Paint buttonPaint;

private Canvas canvas;

private Bitmap bitmap;

private Bitmap thumb;

private Bitmap spot;

private Bitmap spot_on;

private int hotarea = ;//点击的热区

private int cur_sections = ;

private ResponseOnTouch responseOnTouch;

private int bitMapHeight = ;//第一个点的起始位置起始,图片的长宽是76,所以取一半的距离

private int textMove = ;//字与下方点的距离,因为字体字体是40px,再加上10的间隔

private int[] colors = new int[]{0xffdf5600,0x33000000};//进度条的橙色,进度条的灰色,字体的灰色

private int textSize;

private int circleRadius;

private ArrayList section_title;

public CustomSeekbar(Context context) {

super(context);

}

public CustomSeekbar(Context context, AttributeSet attrs) {

this(context, attrs, );

}

public CustomSeekbar(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

cur_sections = ;

bitmap = Bitmap.createBitmap(, , Bitmap.Config.ARGB_8888);

canvas = new Canvas();

canvas.setBitmap(bitmap);

thumb = BitmapFactory.decodeResource(getResources(), R.drawable.set_button_0);

spot = BitmapFactory.decodeResource(getResources(),R.drawable.spot);

spot_on = BitmapFactory.decodeResource(getResources(),R.drawable.spot_on);

bitMapHeight = thumb.getHeight()/;

textMove = bitMapHeight+;

textSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, , getResources().getDisplayMetrics());

circleRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, , getResources().getDisplayMetrics());

mPaint = new Paint(Paint.DITHER_FLAG);

mPaint.setAntiAlias(true);//锯齿不显示

mPaint.setStrokeWidth();

mTextPaint = new Paint(Paint.DITHER_FLAG);

mTextPaint.setAntiAlias(true);

mTextPaint.setTextSize(textSize);

mTextPaint.setColor(0xffb5b5b4);

buttonPaint = new Paint(Paint.DITHER_FLAG);

buttonPaint.setAntiAlias(true);

//initData(null);

}

/**

* 实例化后调用,设置bar的段数和文字

*/

public void initData(ArrayList section){

if(section != null){

section_title = section;

}else {

String[] str = new String[]{"低", "中", "高"};

section_title = new ArrayList();

for (int i = ; i < str.length; i++) {

section_title.add(str[i]);

}

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

width = widthSize;

float scaleX = widthSize / ;

float scaleY = heightSize / ;

scale = Math.max(scaleX,scaleY);

//控件的高度

// height = 185;

height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, , getResources().getDisplayMetrics());

setMeasuredDimension(width, height);

width = width-bitMapHeight/;

perWidth = (width - section_title.size()*spot.getWidth() - thumb.getWidth()/) / (section_title.size()-);

hotarea = perWidth/;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPaint.setColor(Color.WHITE);

mPaint.setStyle(Paint.Style.FILL);

mPaint.setAlpha();

canvas.drawRect(, , getMeasuredWidth(), getMeasuredHeight(), mPaint);

canvas.drawBitmap(bitmap, , , null);

mPaint.setAlpha();

mPaint.setColor(colors[]);

canvas.drawLine(bitMapHeight, height * / , width - bitMapHeight - spot_on.getWidth() / , height * / , mPaint);

int section = ;

while(section < section_title.size()){

if(section < cur_sections) {

mPaint.setColor(colors[]);

canvas.drawLine(thumb.getWidth()/ + section * perWidth + (section+) * spot_on.getWidth(),height * / ,

thumb.getWidth()/ + section * perWidth + (section+) * spot_on.getWidth() + perWidth,height * / ,mPaint);

canvas.drawBitmap(spot_on, thumb.getWidth()/ + section * perWidth + section * spot_on.getWidth(),height * / - spot_on.getHeight()/,mPaint);

}else{

mPaint.setAlpha();

if(section == section_title.size()-){

canvas.drawBitmap(spot, width - spot_on.getWidth() - bitMapHeight/, height * / - spot.getHeight() / , mPaint);

}else {

canvas.drawBitmap(spot, thumb.getWidth()/ + section * perWidth + section * spot_on.getWidth(), height * / - spot.getHeight() / , mPaint);

}

}

if(section == section_title.size()-) {

canvas.drawText(section_title.get(section), width - spot_on.getWidth()- bitMapHeight/ - textSize / , height * / - textMove, mTextPaint);

}else{

canvas.drawText(section_title.get(section), thumb.getWidth()/ + section * perWidth + section * spot_on.getWidth(), height * / - textMove, mTextPaint);

}

section++;

}

if(cur_sections == section_title.size()-){

canvas.drawBitmap(thumb, width - spot_on.getWidth() - bitMapHeight/ - thumb.getWidth() / ,

height * / - bitMapHeight, buttonPaint);

}else {

canvas.drawBitmap(thumb, thumb.getWidth()/ + cur_sections * perWidth + cur_sections * spot_on.getWidth() - thumb.getWidth()/ ,

height * / - bitMapHeight, buttonPaint);

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

super.onTouchEvent(event);

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

thumb = BitmapFactory.decodeResource(getResources(), R.drawable.set_button_1);

downX = (int) event.getX();

downY = (int) event.getY();

responseTouch(downX, downY);

break;

case MotionEvent.ACTION_MOVE:

thumb = BitmapFactory.decodeResource(getResources(), R.drawable.set_button_1);

moveX = (int) event.getX();

moveY = (int) event.getY();

responseTouch(moveX, moveY);

break;

case MotionEvent.ACTION_UP:

thumb = BitmapFactory.decodeResource(getResources(), R.drawable.set_button_0);

upX = (int) event.getX();

upY = (int) event.getY();

responseTouch(upX, upY);

responseOnTouch.onTouchResponse(cur_sections);

break;

}

return true;

}

private void responseTouch(int x, int y){

if(x <= width-bitMapHeight/) {

cur_sections = (x + perWidth / ) / perWidth;

}else{

cur_sections = section_title.size()-;

}

invalidate();

}

//设置监听

public void setResponseOnTouch(ResponseOnTouch response){

responseOnTouch = response;

}

//设置进度

public void setProgress(int progress){

cur_sections = progress;

invalidate();

}

}

带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变

带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变 转 https://blog.csdn.net/qq_30993595/article/details/78915115   近期有 ...

Android自定义带标题边框的Layout

今天工作中又碰到个小问题,项目需要用到像Java Swing的JPanel一样带标题边框的布局,Android里没有类似控件,想到这个也不难,自己画了一个,是继承LinearLayout的一个自定义布 ...

Android -- 自定义带进度条的按钮

1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击

Android 自定义带回调的Dialog 及EditText相关

import android.app.Activity; import android.content.Context; import android.text.Editable; import ...

wpf自定义带刻度的柱状图控件

效果图: 主要代码xaml:

Android实现自定义带文字和图片的Button

Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

Android自定义Seekbar拖动条式样

SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...

我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)

今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...

随机推荐

表格中每行的checkbox只能选中其中一个jquery实现

HTML代码: 12.

Android中的SeekBar是一种常见的用户界面组件,它允许用户通过滑动来选择一个范围内的值。然而,默认情况下,SeekBar只显示一个可移动的滑块,没有刻度。 如果我们想要一个刻度SeekBar,我们需要进行一些自定义。其中一种方法是使用SeekBar的OnSeekBarChangeListener回调接口。我们可以编写一个自定义的OnSeekBarChangeListener,根据SeekBar的值来更新刻度。 首先,我们可以创建一个布局文件,包含一个SeekBar和一个用于显示刻度的TextView。然后,在代码中获取SeekBar和TextView的实例,并设置SeekBar的max值和初始值。 接下来,我们需要为SeekBar添加一个自定义的OnSeekBarChangeListener。在监听器的onProgressChanged方法中,我们可以获取SeekBar的当前值,并根据需要更新刻度。例如,我们可以将刻度的范围划分为10个等级,当SeekBar的值在某个等级范围内时,我们就更新TextView的显示内容为对应的刻度。 最后,我们将SeekBar和TextView添加到布局中,并显示在屏幕上。当用户滑动SeekBar时,刻度将会实时更新并显示在TextView上。 总结起来,要实现一个刻度SeekBar,我们需要进行自定义,通过实现SeekBar的OnSeekBarChangeListener接口来更新刻度,并将SeekBar和显示刻度的TextView添加到布局中。 这样,我们就可以在Android应用程序中使用刻度SeekBar,以更好地满足用户需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值