• Android 自定义SeekBar显示进度百分比


    }

    // Set atributtes of XML to View

    protected void setAttributes(AttributeSet attrs) {

    setBackgroundResource(R.drawable.background_transparent);

    // Set size of view

    setMinimumHeight(Utils.dpToPx(48, getResources()));

    setMinimumWidth(Utils.dpToPx(80, getResources()));

    // Set background Color

    // Color by resource

    int bacgroundColor = attrs.getAttributeResourceValue(ANDROIDXML,

    “background”, -1);

    if (bacgroundColor != -1) {

    setBackgroundColor(getResources().getColor(bacgroundColor));

    } else {

    // Color by hexadecimal

    int background = attrs.getAttributeIntValue(ANDROIDXML,

    “background”, -1);

    if (background != -1)

    setBackgroundColor(background);

    }

    showNumberIndicator = attrs.getAttributeBooleanValue(MATERIALDESIGNXML,

    “showNumberIndicator”, false);

    min = attrs.getAttributeIntValue(MATERIALDESIGNXML, “min”, 0);

    max = attrs.getAttributeIntValue(MATERIALDESIGNXML, “max”, 0);

    value = attrs.getAttributeIntValue(MATERIALDESIGNXML, “value”, min);

    ball = new Ball(getContext());

    RelativeLayout.LayoutParams params = new LayoutParams(Utils.dpToPx(20,

    getResources()), Utils.dpToPx(20, getResources()));

    params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);

    ball.setLayoutParams(params);

    addView(ball);

    // Set if slider content number indicator

    // TODO

    if (showNumberIndicator) {

    numberIndicator = new NumberIndicator(getContext());

    }

    }

    @Override

    public void invalidate() {

    ball.invalidate();

    super.invalidate();

    }

    @Override

    protected void onDraw(Canvas canvas) {

    super.onDraw(canvas);

    if (!placedBall)

    placeBall();

    if (value == min) {

    // Crop line to transparent effect

    Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(),

    canvas.getHeight(), Bitmap.Config.ARGB_8888);

    Canvas temp = new Canvas(bitmap);

    Paint paint = new Paint();

    paint.setColor(Color.parseColor(“#B0B0B0”));

    paint.setStrokeWidth(Utils.dpToPx(2, getResources()));

    temp.drawLine(getHeight() / 2, getHeight() / 2, getWidth()

    • getHeight() / 2, getHeight() / 2, paint);

    Paint transparentPaint = new Paint();

    transparentPaint.setColor(getResources().getColor(

    android.R.color.transparent));

    transparentPaint.setXfermode(new PorterDuffXfermode(

    PorterDuff.Mode.CLEAR));

    temp.drawCircle(ViewHelper.getX(ball) + ball.getWidth() / 2,

    ViewHelper.getY(ball) + ball.getHeight() / 2,

    ball.getWidth() / 2, transparentPaint);

    canvas.drawBitmap(bitmap, 0, 0, new Paint());

    } else {

    Paint paint = new Paint();

    paint.setColor(Color.parseColor(“#B0B0B0”));

    paint.setStrokeWidth(Utils.dpToPx(2, getResources()));

    canvas.drawLine(getHeight() / 2, getHeight() / 2, getWidth()

    • getHeight() / 2, getHeight() / 2, paint);

    paint.setColor(backgroundColor);

    float division = (ball.xFin - ball.xIni) / (max - min);

    int value = this.value - min;

    canvas.drawLine(getHeight() / 2, getHeight() / 2, value * division

    • getHeight() / 2, getHeight() / 2, paint);

    }

    if (press && !showNumberIndicator) {

    Paint paint = new Paint();

    paint.setColor(backgroundColor);

    paint.setAntiAlias(true);

    canvas.drawCircle(ViewHelper.getX(ball) + ball.getWidth() / 2,

    getHeight() / 2, getHeight() / 3, paint);

    }

    invalidate();

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    isLastTouch = true;

    if (isEnabled()) {

    if (event.getAction() == MotionEvent.ACTION_DOWN

    || event.getAction() == MotionEvent.ACTION_MOVE) {

    if (numberIndicator != null

    && numberIndicator.isShowing() == false)

    numberIndicator.show();

    if ((event.getX() <= getWidth() && event.getX() >= 0)) {

    press = true;

    // calculate value

    int newValue = 0;

    float division = (ball.xFin - ball.xIni) / (max - min);

    if (event.getX() > ball.xFin) {

    newValue = max;

    } else if (event.getX() < ball.xIni) {

    newValue = min;

    } else {

    newValue = min

    • (int) ((event.getX() - ball.xIni) / division);

    }

    if (value != newValue) {

    value = newValue;

    if (onValueChangedListener != null)

    onValueChangedListener.onValueChanged(newValue);

    }

    // move ball indicator

    float x = event.getX();

    x = (x < ball.xIni) ? ball.xIni : x;

    x = (x > ball.xFin) ? ball.xFin : x;

    ViewHelper.setX(ball, x);

    ball.changeBackground();

    // If slider has number indicator

    if (numberIndicator != null) {

    // move number indicator

    numberIndicator.indicator.x = x;

    numberIndicator.indicator.finalY = Utils

    .getRelativeTop(this) - getHeight() / 2;

    numberIndicator.indicator.finalSize = getHeight() / 2;

    numberIndicator.numberIndicator.setText(“”);

    }

    } else {

    press = false;

    isLastTouch = false;

    if (numberIndicator != null)

    numberIndicator.dismiss();

    }

    } else if (event.getAction() == MotionEvent.ACTION_UP

    || event.getAction() == MotionEvent.ACTION_CANCEL) {

    if (numberIndicator != null)

    numberIndicator.dismiss();

    isLastTouch = false;

    press = false;

    }

    }

    return true;

    }

    /**

    • Make a dark color to press effect

    • @return

    */

    protected int makePressColor() {

    int r = (this.backgroundColor >> 16) & 0xFF;

    int g = (this.backgroundColor >> 8) & 0xFF;

    int b = (this.backgroundColor >> 0) & 0xFF;

    r = (r - 30 < 0) ? 0 : r - 30;

    g = (g - 30 < 0) ? 0 : g - 30;

    b = (b - 30 < 0) ? 0 : b - 30;

    return Color.argb(70, r, g, b);

    }

    private void placeBall() {

    ViewHelper.setX(ball, getHeight() / 2 - ball.getWidth() / 2);

    ball.xIni = ViewHelper.getX(ball);

    ball.xFin = getWidth() - getHeight() / 2 - ball.getWidth() / 2;

    ball.xCen = getWidth() / 2 - ball.getWidth() / 2;

    placedBall = true;

    }

    // GETERS & SETTERS

    public OnValueChangedListener getOnValueChangedListener() {

    return onValueChangedListener;

    }

    public void setOnValueChangedListener(

    OnValueChangedListener onValueChangedListener) {

    this.onValueChangedListener = onValueChangedListener;

    }

    public int getValue() {

    return value;

    }

    public void setValue(final int value) {

    if (placedBall == false)

    post(new Runnable() {

    @Override

    public void run() {

    setValue(value);

    }

    });

    else {

    this.value = value;

    float division = (ball.xFin - ball.xIni) / max;

    ViewHelper.setX(ball,

    value * division + getHeight() / 2 - ball.getWidth() / 2);

    ball.changeBackground();

    }

    }

    public int getMax() {

    return max;

    }

    public void setMax(int max) {

    this.max = max;

    }

    public int getMin() {

    return min;

    }

    public void setMin(int min) {

    this.min = min;

    }

    public boolean isShowNumberIndicator() {

    return showNumberIndicator;

    }

    public void setShowNumberIndicator(boolean showNumberIndicator) {

    this.showNumberIndicator = showNumberIndicator;

    numberIndicator = (showNumberIndicator) ? new NumberIndicator(

    getContext()) : null;

    }

    @Override

    public void setBackgroundColor(int color) {

    backgroundColor = color;

    if (isEnabled())

    beforeBackground = backgroundColor;

    }

    boolean placedBall = false;

    class Ball extends View {

    float xIni, xFin, xCen;

    public Ball(Context context) {

    super(context);

    setBackgroundResource(R.drawable.background_switch_ball_uncheck);

    }

    public void changeBackground() {

    if (value != min) {

    setBackgroundResource(R.drawable.background_checkbox);

    LayerDrawable layer = (LayerDrawable) getBackground();

    GradientDrawable shape = (GradientDrawable) layer

    .findDrawableByLayerId(R.id.shape_bacground);

    shape.setColor(backgroundColor);

    } else {

    setBackgroundResource(R.drawable.background_switch_ball_uncheck);

    }

    }

    }

    // Slider Number Indicator

    class NumberIndicator extends Dialog {

    Indicator indicator;

    TextView numberIndicator;

    public NumberIndicator(Context context) {

    super(context, android.R.style.Theme_Translucent);

    }

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.number_indicator_spinner);

    setCanceledOnTouchOutside(false);

    RelativeLayout content = (RelativeLayout) this

    .findViewById(R.id.number_indicator_spinner_content);

    indicator = new Indicator(this.getContext());

    content.addView(indicator);

    numberIndicator = new TextView(getContext());

    numberIndicator.setTextColor(Color.WHITE);

    numberIndicator.setGravity(Gravity.CENTER);

    conte
    nt.addView(numberIndicator);

    indicator.setLayoutParams(new RelativeLayout.LayoutParams(

    RelativeLayout.LayoutParams.FILL_PARENT,

    RelativeLayout.LayoutParams.FILL_PARENT));

    }

    @Override

    public void dismiss() {

  • 相关阅读:
    NSE脚本使用
    python学习之【包和内置模块】
    为什么 Python 代码在函数中运行得更快?
    2023护网行动面试题目汇总
    Opencv学习项目3——pytesseract
    金仓数据库KingbaseES运维工具参考手册(2. 通用环境变量参数文件)
    lv7 嵌入式开发-网络编程开发 02OSI七层结构
    【PAT甲级 - C++题解】1093 Count PAT‘s
    应用层mmap和驱动层mmap之间的联系
    k8s 对外发布(ingress)
  • 原文地址:https://blog.csdn.net/2401_85610402/article/details/139725010