Android自定义Seekbar滑动条 Pop提示跟随滑动按钮滑动

本文实例为大家分享了Android自定义Seekbar滑动条的具体代码,供大家参考,具体内容如下

由于项目需要做出此效果,自定义写了一个。

效果图

思路:

原始的seekbar只有滑动条并没有下方的提示文字,所以我们必须要继承Seekbar重写这个控件。

代码:

在values文件夹下新建attrs.xml,用于设置跟随滑动按钮的文字大小,颜色,背景。

<declare-styleable name="MySeekBar">
    <attr name="textsize" format="dimension" />
    <attr name="textcolor" format="color" />
    <attr name="img" format="reference" />
</declare-styleable>

在布局里引用此控件

 <com.jzh.myseekbar.MySeekBar
      android:id="@+id/seekBar"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:max="80"
      android:maxHeight="10dp"
      android:progress="0"
      android:progressDrawable="@drawable/seekbar_style"
      android:splitTrack="false"
      android:thumb="@mipmap/niu"
      app:img="@mipmap/ann"
      app:textcolor="#fff"
      app:textsize="14dp" />

自定义控件样式

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:id="@android:id/background">

    <shape>
      <corners android:radius="5dp" />
      <gradient
        android:angle="0"
        android:centerColor="@android:color/holo_orange_dark"
        android:endColor="@android:color/holo_red_dark"
        android:startColor="#2aade3" />
    </shape>
  </item>

</layer-list>

主要核心代码

/**
   * 文本的颜色
   */
  private int mTitleTextColor;
  /**
   * 文本的大小
   */
  private float mTitleTextSize;
  private String mTitleText;//文字的内容

  /**
   * 背景图片
   */
  private int img;
  private Bitmap map;
  //bitmap对应的宽高
  private float img_width, img_height;
  Paint paint;

  private float numTextWidth;
  //测量seekbar的规格
  private Rect rect_seek;
  private Paint.FontMetrics fm;

  public static final int TEXT_ALIGN_LEFT = 0x00000001;
  public static final int TEXT_ALIGN_RIGHT = 0x00000010;
  public static final int TEXT_ALIGN_CENTER_VERTICAL = 0x00000100;
  public static final int TEXT_ALIGN_CENTER_HORIZONTAL = 0x00001000;
  public static final int TEXT_ALIGN_TOP = 0x00010000;
  public static final int TEXT_ALIGN_BOTTOM = 0x00100000;
  /**
   * 文本中轴线X坐标
   */
  private float textCenterX;
  /**
   * 文本baseline线Y坐标
   */
  private float textBaselineY;
  /**
   * 文字的方位
   */
  private int textAlign;

  public MySeekBar(Context context) {
    this(context, null);
  }

  public MySeekBar(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public MySeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MySeekBar, defStyleAttr, 0);
    int n = array.getIndexCount();
    for (int i = 0; i < n; i++) {
      int attr = array.getIndex(i);
      switch (attr) {
        case R.styleable.MySeekBar_textsize:
          mTitleTextSize = array.getDimension(attr, 15f);
          break;
        case R.styleable.MySeekBar_textcolor:
          mTitleTextColor = array.getColor(attr, Color.WHITE);
          break;
        case R.styleable.MySeekBar_img:
          img = array.getResourceId(attr, R.mipmap.ic_launcher);
          break;
      }
    }
    array.recycle();
    getImgWH();
    paint = new Paint();
    paint.setAntiAlias(true);//设置抗锯齿
    paint.setTextSize(mTitleTextSize);//设置文字大小
    paint.setColor(mTitleTextColor);//设置文字颜色
    //设置控件的padding 给提示文字留出位置
    setPadding((int) Math.ceil(img_width) / 2, 0, (int) Math.ceil(img_height) / 2, (int) Math.ceil(img_height) + 10);
    textAlign = TEXT_ALIGN_CENTER_HORIZONTAL | TEXT_ALIGN_CENTER_VERTICAL;
  }

  /**
   * 获取图片的宽高
   */
  private void getImgWH() {
    map = BitmapFactory.decodeResource(getResources(), img);
    img_width = map.getWidth();
    img_height = map.getHeight();

  }

  @Override
  protected synchronized void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    setTextLocation();//定位文本绘制的位置
    rect_seek = this.getProgressDrawable().getBounds();
    //定位文字背景图片的位置
    float bm_x = rect_seek.width() * getProgress() / getMax();
    float bm_y = rect_seek.height() + 20;
//    //计算文字的中心位置在bitmap
    float text_x = rect_seek.width() * getProgress() / getMax() + (img_width - numTextWidth) / 2;
    canvas.drawBitmap(map, bm_x, bm_y, paint);//画背景图
    // canvas.drawRoundRect();
    canvas.drawText(mTitleText, text_x, (float) (textBaselineY + bm_y + (0.16 * img_height / 2)), paint);//画文字

  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    invalidate();//监听手势滑动,不断重绘文字和背景图的显示位置
    return super.onTouchEvent(event);
  }

  /**
   * 定位文本绘制的位置
   */
  private void setTextLocation() {

    fm = paint.getFontMetrics();
    //文本的宽度
    mTitleText = getProgress() + 10 + "℃";

    numTextWidth = paint.measureText(mTitleText);

    float textCenterVerticalBaselineY = img_height / 2 - fm.descent + (fm.descent - fm.ascent) / 2;
    switch (textAlign) {
      case TEXT_ALIGN_CENTER_HORIZONTAL | TEXT_ALIGN_CENTER_VERTICAL:
        textCenterX = img_width / 2;
        textBaselineY = textCenterVerticalBaselineY;
        break;
      case TEXT_ALIGN_LEFT | TEXT_ALIGN_CENTER_VERTICAL:
        textCenterX = numTextWidth / 2;
        textBaselineY = textCenterVerticalBaselineY;
        break;
      case TEXT_ALIGN_RIGHT | TEXT_ALIGN_CENTER_VERTICAL:
        textCenterX = img_width - numTextWidth / 2;
        textBaselineY = textCenterVerticalBaselineY;
        break;
      case TEXT_ALIGN_BOTTOM | TEXT_ALIGN_CENTER_HORIZONTAL:
        textCenterX = img_width / 2;
        textBaselineY = img_height - fm.bottom;
        break;
      case TEXT_ALIGN_TOP | TEXT_ALIGN_CENTER_HORIZONTAL:
        textCenterX = img_width / 2;
        textBaselineY = -fm.ascent;
        break;
      case TEXT_ALIGN_TOP | TEXT_ALIGN_LEFT:
        textCenterX = numTextWidth / 2;
        textBaselineY = -fm.ascent;
        break;
      case TEXT_ALIGN_BOTTOM | TEXT_ALIGN_LEFT:
        textCenterX = numTextWidth / 2;
        textBaselineY = img_height - fm.bottom;
        break;
      case TEXT_ALIGN_TOP | TEXT_ALIGN_RIGHT:
        textCenterX = img_width - numTextWidth / 2;
        textBaselineY = -fm.ascent;
        break;
      case TEXT_ALIGN_BOTTOM | TEXT_ALIGN_RIGHT:
        textCenterX = img_width - numTextWidth / 2;
        textBaselineY = img_height - fm.bottom;
        break;
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿微信底部按钮滑动变色

    Android仿微信底部按钮滑动变色,这里只针对使用Fragment为Tab页的滑动操作,进行简单的变色讲解. 首先说下OnPageChangeListener这个监听 //这个监听有三个方法 public abstract void onPageScrollStateChanged (int state) public abstract void onPageScrolled (int position, float positionOffset, int positionOffsetPixe

  • Android自定义实现可滑动按钮

    本文实例为大家分享了Android自定义实现可滑动按钮的具体代码,供大家参考,具体内容如下 实现逻辑 1.创建一个类继承view类,实现里面的onMeasure() onDraw()方法 2.在 onMeasure() 中需要调用setMeasuredDimension(viewWidth,viewheight),用来绘制按钮的位置区域 3.需要加载按钮的背景和滑块资源 并且转化为bitmap对象 4.获取背景图片的宽和高作为自定义控件的宽和高 5.获取滑块的宽度,用来调整按钮的开和关 6.在o

  • 如何在Android中实现渐显按钮的左右滑动效果

    先看下运行效果:    程序结构: MainActivity文件中代码: 复制代码 代码如下: package com.android.buttonpageflipper;import android.app.Activity;import android.graphics.PixelFormat;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Gra

  • Android编程实现滑动按钮功能详解

    本文实例讲述了Android编程实现滑动按钮功能.分享给大家供大家参考,具体如下: 首先效果图: 然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class main.class import android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Main extends Acti

  • 自定义滑动按钮为例图文剖析Android自定义View绘制

    自定义View一直是横在Android开发者面前的一道坎. 一.View和ViewGroup的关系 从View和ViewGroup的关系来看,ViewGroup继承View. View的子类,多是功能型的控件,提供绘制的样式,比如imageView,TextView等,而ViewGroup的子类,多用于管理控件的大小,位置,如LinearLayout,RelativeLayout等,从下图可以看出 从实际应用中看,他们又是组合关系,我们在布局中,常常是一个ViewGroup嵌套多个ViewGro

  • Android编程之滑动按钮事件实例详解

    本文实例讲述了Android滑动按钮事件.分享给大家供大家参考,具体如下: 今天纪录一下滑动按钮功能.. 首先效果图: 然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class main.class import Android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Main e

  • Android自定义Seekbar滑动条 Pop提示跟随滑动按钮滑动

    本文实例为大家分享了Android自定义Seekbar滑动条的具体代码,供大家参考,具体内容如下 由于项目需要做出此效果,自定义写了一个. 效果图 思路: 原始的seekbar只有滑动条并没有下方的提示文字,所以我们必须要继承Seekbar重写这个控件. 代码: 在values文件夹下新建attrs.xml,用于设置跟随滑动按钮的文字大小,颜色,背景. <declare-styleable name="MySeekBar"> <attr name="text

  • Android自定义双向进度条的实现代码

    想整个双向的进度条,就是可以选取播放范围的. 像这样: 然而官方控件里只有单向的.不要慌,我们自己画一个. 绘制一个进度条主要是三方面.1.样式,2.尺寸,3.操作监听. 完整代码来一遍: 注释基本上就把原理说明了一下. package util; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint;

  • Android 自定义SeekBar动态改变硬件音量大小实现和音量键的同步(推荐)

    1,上图: 2,代码: MainActivity.Java package com.hero.zhaoq.seekbarchangeddemo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObse

  • Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码

    在最近的开发工作中,要实现一个调色板的进度条,SeekBar要分成10段显示不同颜色,功夫不负有心人,终于实现了这个功能,下面分享给大家 示例图: 1.自定义SeekBar import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import

  • Android中SeekBar拖动条使用方法详解

    本文实例为大家分享了Android中SeekBar拖动条使用方法的具体代码,供大家参考,具体内容如下 SeekBar控件效果展示 拖动条SeekBar继承了ProgressBar,因此ProgressBar所支持的xml属性和方法完全适合SeekBar.只是进度条ProgressBar采用颜色填充来表明进度完成程度,拖动条SeekBar则通过滑块的外置来标识--拖动滑块允许进度值的改变.(例如:条件Android系统的音量) 如上图,通过拖动SeekBar滑块,实现图片透明度的修改.实现代码如下

  • Android 自定义一套 Dialog通用提示框 (代码库)

    做Android开发五年了,期间做做停停(去做后台开发,服务器管理),当回来做Android的时候,发现很生疏,好些控件以前写得很顺手,现在好像忘记些什么了,总要打开这个项目,打开那个项目,有时未必还找得到. 总结起来,还是源于没有好好做一个属于自己的代码库,把平时开发项目中一些自定义的控件,或一些耦合性很低的模块封装起来,或者平时比较少写博客.如果你是一个刚学会开发的程序猿,或者是有过好几年开发经验的大鸟,也该开始整理整理自己的代码,这也不枉此生敲代码的岁月,同时在面试中,也会给你带来不少印象

  • Android自定义圆弧进度条加数字动态变化

    本文实例为大家分享了Android自定义圆弧进度条数字变化的具体代码,供大家参考,具体内容如下 效果如下: 思路:一个内环圆弧和一个外环圆弧,因为有一个圆圈是在圆弧上做圆周运动,所以在画圆的时候必须要得到圆弧上的各个点的坐标,这里其实就用到了PathMeasure这个类,可以帮我们拿到这些点,在画圆弧的时候也理所应当的要使用path,然后根据外界动态的传值进行重绘就能达到动态的效果 代码如下: public class ProgressPathRainbow extends View { pri

  • Android自定义圆形进度条效果

    本文实例为大家分享了Android自定义圆形进度条效果的具体代码,供大家参考,具体内容如下 1 控件 RoundProgress package listview.tianhetbm.p2p.ui; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import a

  • Android自定义SeekBar实现滑动验证且不可点击

    最近公司因为短信接口被盗刷的比较严重,需要做一个类似于淘宝的滑动验证,用于特定环境,以增加一层保障.拿到需求首先想到的是自定义ViewGroup来实现,里面放一个seekbar和TextView即可.但是有更简单的方法,直接在布局中放入seekbar和TextView,不就ok了?用最简单快捷的方法实现需求,才是硬道理. 值得一提的是,seekbar默认情况下是支持点击事件的,也就是说,用户可以直接点击进度条以实现滑动验证这是不允许的,因此,自定义seekbar,屏蔽点击事件.下面我们先从see

  • Android自定义SeekBar实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在SeekBar右边有一个文本框显示当前播放时间/总时间. step1.先来看一看PopupWindow的布局文件,seek_popu.xml,效果如下图所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLa

随机推荐