当前位置:   article > 正文

Android实现跟随滑块移动显示的seekBar_android 自定义seekbar数字滑动

android 自定义seekbar数字滑动

概述

详细讲述跟随滑块移动显示的seekBar效果的自定义实现过程

详细

前言

Android开发过程中,我们有时会使用到自定义Seekbar,如在滑动滑块时,文字随滑块移动之类的效果,今天就来讲讲跟随滑块移动显示的seekBar的实现吧。

今天涉及内容:

  1. 自定义随滑块移动文字效果的seekbar的难点
  2. TextSeekBarActivity中的使用
  3. 需要注意的点
  4. 效果图和项目结构图

效果图如下:

效果图.gif

一. 自定义随滑块移动文字效果的seekbar的难点

这里我们继承AppCompatSeekBar来实现随滑块移动显示的seekBar,该类叫TextSeekBar,实现过程中有两个难点:

  • 滑块在移动到TextSeekBar的最左边和最右边的时候,是否能显示完整
  • 滑块滑动时,滑块上方的文字是否能正常显示在滑块上方

针对以上问题,在初始化TextSeekBar控件时,我们要设置一个setPadding,留出左右两边滑块的显示余量。
滑块滑动时,要根据进度实时刷新文字在x方向的坐标

二. TextSeekBar 在 Activity 中的使用

先给出Activity对应布局文件activity_main.xml代码:

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <TextView
  9. android:id="@+id/tv_text"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:text="Hello World!"
  13. app:layout_constraintLeft_toLeftOf="parent"
  14. app:layout_constraintRight_toRightOf="parent"
  15. app:layout_constraintTop_toTopOf="parent"
  16. android:layout_marginTop="@dimen/dp_70"/>
  17. <Button
  18. android:id="@+id/btn_test"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="测试1"
  22. app:layout_constraintStart_toStartOf="parent"
  23. app:layout_constraintEnd_toEndOf="parent"
  24. app:layout_constraintTop_toBottomOf="@+id/tv_text"
  25. android:layout_marginTop="@dimen/dp_20"/>
  26. <Button
  27. android:id="@+id/btn_test2"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:text="测试n"
  31. app:layout_constraintStart_toStartOf="parent"
  32. app:layout_constraintEnd_toEndOf="parent"
  33. app:layout_constraintTop_toBottomOf="@+id/btn_test"
  34. android:layout_marginTop="@dimen/dp_20"/>
  35. <FrameLayout
  36. android:layout_width="0dp"
  37. android:layout_height="100dp"
  38. android:layout_gravity="center_vertical"
  39. android:layout_marginStart="20dp"
  40. android:layout_marginTop="14dp"
  41. app:layout_constraintTop_toBottomOf="@+id/btn_test2"
  42. app:layout_constraintStart_toStartOf="parent"
  43. app:layout_constraintEnd_toEndOf="parent"
  44. android:layout_weight="1">
  45. <ImageView
  46. android:layout_width="match_parent"
  47. android:layout_height="match_parent"
  48. android:layout_marginStart="20dp"
  49. android:layout_marginEnd="20dp"
  50. android:scaleType="fitCenter"
  51. android:src="@drawable/ic_bg" />
  52. <com.pain.testdemo.function.TextSeekBar
  53. android:id="@+id/text_seek_bar"
  54. android:layout_width="match_parent"
  55. android:layout_height="match_parent"
  56. android:maxHeight="16dp"
  57. android:splitTrack="false"
  58. android:thumb="@drawable/temp_seekbar"
  59. app:offset_x="-2dp"
  60. app:offset_y="16dp"
  61. app:stroke_width="1.5dp"
  62. app:text_color="@color/red"
  63. app:text_size="30sp"
  64. app:thumb_width="60dp" />
  65. </FrameLayout>
  66. </androidx.constraintlayout.widget.ConstraintLayout>

下面看看TextSeekBarActivity 中的使用:

  1. package com.pain.testdemo;
  2. import androidx.annotation.RequiresApi;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.os.Build;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.SeekBar;
  9. import android.widget.TextView;
  10. import com.pain.testdemo.function.TextSeekBar;
  11. import com.pain.testdemo.util.MyUtil;
  12. @RequiresApi(api = Build.VERSION_CODES.O)
  13. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  14. private TextView mTv;
  15. private Button mBtn;
  16. private Button mBtn2;
  17. private TextSeekBar mTextSeekBar;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. MyUtil.i("=======onCreate======");
  23. initView();
  24. initData();
  25. setListener();
  26. }
  27. private void initView() {
  28. mTv = findViewById(R.id.tv_text);
  29. mBtn = findViewById(R.id.btn_test);
  30. mBtn2 = findViewById(R.id.btn_test2);
  31. mTextSeekBar = findViewById(R.id.text_seek_bar);
  32. }
  33. private void initData() {
  34. mTextSeekBar.setMax(100);
  35. mTextSeekBar.setMin(0);
  36. }
  37. private void setListener() {
  38. mBtn.setOnClickListener(this);
  39. mBtn2.setOnClickListener(this);
  40. mTextSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  41. @Override
  42. public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
  43. mTextSeekBar.updateView(i);
  44. }
  45. @Override
  46. public void onStartTrackingTouch(SeekBar seekBar) {
  47. }
  48. @Override
  49. public void onStopTrackingTouch(SeekBar seekBar) {
  50. }
  51. });
  52. }
  53. @Override
  54. public void onClick(View v) {
  55. switch (v.getId()) {
  56. case R.id.btn_test:
  57. MyUtil.i("=======test======");
  58. break;
  59. case R.id.btn_test2:
  60. MyUtil.i("=======test2=====");
  61. break;
  62. default:
  63. break;
  64. }
  65. }
  66. }
三. 需要注意的点

需要注意的是,当我们在给TextSeekBar设置纯色背景的时候,可以用android:background属性结合xmlshape来设置背景,但是当TextSeekBar的背景为图片时,我们再按这种方式设置就会导致图片显示变形的问题,于是我们可以利用布局来解决这个问题,也就是上文中activity_main.xml写的那样:

  1. <FrameLayout
  2. //其他代码省略
  3. //......
  4. >
  5. <ImageView
  6. //其他代码省略
  7. //......
  8. android:src="@drawable/ic_bg" />
  9. <com.pain.testdemo.function.TextSeekBar
  10. //其他代码省略
  11. //......
  12. />
  13. </FrameLayout>

FrameLayout包裹,ImageView打底,然后利用ImageView设置图片的属性来调节背景图片的显示。

四. 效果图和项目结构图

效果图.gif

ok,今天关于自定义seekBar的知识就介绍到这里了,谢谢大家。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号