优雅实现垂直SeekBar:不继承Seekbar、不自定义View

Android实现自定义的垂直SeekBar 然而,默认的SeekBar只支持水平方向的滑动,如果我们需要实现一个垂直方向的SeekBar,就需要进行一些自定义。在这个示例中,我们将垂直SeekBar放置在一个垂直方向的LinearLayout中,并设置了一些基本属性,如ID、宽度、高度和最大值。首先,我们需要创建一个自定义的垂直SeekBar类,继承自SeekBar。方法:用于绘制SeekBar,在绘制之前对画布进行旋转和平移操作,使SeekBar在垂直方向上正确显示。方法:用于测量SeekBar的尺寸,将宽度和高度进行交换,以实现垂直方向的滑动。 阅读详情
AI摘要

文章介绍了如何在Android中实现竖直SeekBar,不通过自定义View而是利用现有组件和属性。通过将SeekBar旋转270度,配合布局调整和自定义样式属性,实现了可客制化的音量或亮度调节UI。同时,文章讨论了自定义View的优缺点,强调了功能和性能的平衡。提供了XML布局解析、自定义样式属性与主题设置、编码实现等详细步骤,并展示了如何在代码中动态添加和使用竖直SeekBar。

目录

0 前言

关于自定义View

1 实现竖直SeekBar

1.1 XML布局解析

1.1.1 套一层FrameLayout

1.1.2 SeekBar去除左右间距

1.1.3 SeekBar高度无法设置

1.1.4 SeekBar背景设置

1.1.5 底部View尺寸和距底部距离不硬编码

1.2 自定义样式属性与主题

1.2.1 自定义样式属性

1.2.2 自定义主题指定属性

1.3 编码实现

1.3.1 对外提供客制化

1.3.2 支持代码中动态添加使用

1.3.3 布局依赖selfWidth/selfHeight

2 使用竖直SeekBar

3 小结


0 前言

        我们知道Android原生不支持垂直的SeekBar,为什么?我想给他们找个的理由,终究是没找到,或许懒惰是程序员的美德吧!好了,下面切入正题:

        实现下面这个UI,你会怎么做?

        下面我们首先来分解下需求:

  1. 音量或亮度调节UI,需要支持可拖动;
  2. 背景、前景、Icon位置、圆角以及UI尺寸可客制化。

        那么,Android的SeekBar支持可拖动,但是水平方向的,如果使用原生则需要将其变为竖直;否则,需要自定义View去绘制这样一个控件。

        另外,UI元素的可客制化要求不能硬编码,这也有好些细节,后面我们会展开讲讲。

关于自定义View

        其实我并不反对自定义View,尽管我们可以自己去画出来这样一个垂直的SeekBar,可是咱能确保自己对View的measure、layout以及draw的处理好过Android原生吗?不会存在性能问题吗?愚以为不见得。且自定义View,可能还费时费力不讨好,UI还原度达不到设计稿上的效果。

        所以,我的思想是尽可能复用Android原生View,或将View进行组合为最佳,其次为切图,是在没招才去自己创建画布绘制View,但一定要兼顾到功能和性能的平衡。比如:我之前通过自定义View实现的VerticalProgress,对功能和性能的平衡就不一定是最佳。

        【自定义View之VerticalProgress_Swuagg的博客】

1 实现竖直SeekBar

        实现竖直SeekBar,目前大抵有如下3种方案:

方案一:通过继承View自定义实现,如:继承View自定义实现VerticalSeekBar

方案二:通过继承SeekBar重载方法内部旋转实现,如:继承SeekBar重载方法内部旋转实现

方案三:对于API 11和更高版本,通过rotation属性在XML中指定旋转270°实现,如:使用seekbar的XML属性(android:rotation="270")获得垂直效果

        看标题我们就知道,本文采用的方案三,不继承SeekBar,不自定义View,下面我们通过代码详细看看。

1.1 XML布局解析

        下面先看看实现效果:

​

        接下来我们再分析下xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <SeekBar
            android:id="@+id/seekbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:paddingStart="0dp"
            android:paddingEnd="0dp"
            android:progressDrawable="?attr/UISeekBarProgressDrawable"
            android:rotation="270"
            android:thumb="@null" />
    </FrameLayout>

    <View
        android:id="@+id/icon"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintWidth_percent="0.5" />

</androidx.constraintlayout.widget.ConstraintLayout>

        首先,我们可以看到未硬编码任何数据,我知道你想拿270反驳我,但这不就是需求设计如此嘛。

1.1.1 套一层FrameLayout

        1)SeekBar旋转270°后会存在尺寸问题,需要套一层FrameLayout,且FrameLayout的宽、高与SeekBar相反,为SeekBar的高、宽,SeekBar也需要指定layout_gravity为center;

       2) 我们发现XML中两者的宽、高都是使用match_parent,是为了让用户客制化尺寸,我们在代码中根据外部使用处的宽、高会进行动态修改。

1.1.2 SeekBar去除左右间距

        SeekBar左右存在默认Padding,设置paddingHorizontal为0未生效,需要设置paddingStart和paddingEnd为0.

1.1.3 SeekBar高度无法设置

        需要同时设置minHeight、minWidth、maxHeight、maxWidth,值为宽与高的最小值,因为未硬编码,所以需在代码中实现。

1.1.4 SeekBar背景设置

        通过自定义属性UISeekBarProgressDrawable,根据主题指定相应drawable,可做到随主题切换。背景文件ui_seekbar_vertical_bg.xml如下:

<?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 android:shape="rectangle">
            <corners android:radius="32dp" />
            <stroke
                android:width="2dp"
                android:color="#3A4266" />
            <solid android:color="#323A60" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <corners android:radius="32dp" />
                <solid android:color="#6E779C" />
            </shape>
        </clip>
    </item>
</layer-list>

1.1.5 底部View尺寸和距底部距离不硬编码

        1)宽度占比一半实现:通过指定宽高为0,设置layout_constraintDimensionRatio="1:1",layout_constraintWidth_percent="0.5",以及左右对齐;

        2)距底部距离,因为未硬编码,所以需在代码中实现。

1.2 自定义样式属性与主题

1.2.1 自定义样式属性

    <declare-styleable name="SeekBarVertical">
        <attr name="UISeekBarProgress" format="integer" />
        <attr name="UISeekBarMax" format="integer" />
        <attr name="UISeekBarIcon" format="reference" />
        <attr name="UISeekBarProgressDrawable" format="reference" />
    </declare-styleable>

1.2.2 自定义主题指定属性

    <!--应用Theme主题-->
    <style name="DefaultAppTheme" parent="android:Theme.Black.NoTitleBar.Fullscreen">
        <item name="UISeekBarProgressDrawable">@drawable/ui_seekbar_vertical_bg</item>
    </style>

1.3 编码实现

package com.agg.ui

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.View
import android.widget.FrameLayout
import android.widget.SeekBar
import androidx.constraintlayout.widget.ConstraintLayout

/**
 * Description:
 * CreateDate:     2023/7/11 14:58
 * Author:         agg
 */
class SeekBarVertical : ConstraintLayout {

    lateinit var parentView: ConstraintLayout
    lateinit var seekBar: SeekBar
    lateinit var icon: View

    private var selfWidth: Int = -1
    private var selfHeight: Int = -1
    private var seekBarMinMaxValue: Int = -1
    private var selfProgress: Int = -1
    private var selfMax: Int = -1
    private var iconDrawable: Drawable? = null

    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyle: Int = 0) : super(
        context, attrs, defStyle
    ) {
        attrs?.let { initAttrs(context, attrs) }
        initView()
    }

    /**
     * 代码中动态添加时使用。如:
     *
     * binding.root.addView(SeekBarVertical(this,192,432))
     */
    constructor(context: Context, width: Int, height: Int) : super(context) {
        selfWidth = width
        selfHeight = height
        seekBarMinMaxValue = if (selfHeight < selfWidth) selfHeight else selfWidth
        initView()
    }

    @SuppressLint("ResourceType")
    private fun initAttrs(context: Context, attrs: AttributeSet) {
        // 获取Android原生宽、高属性
        context.obtainStyledAttributes(
            attrs, intArrayOf(android.R.attr.layout_width, android.R.attr.layout_height)
        ).apply {
            selfWidth = getDimensionPixelSize(0, -1)
            selfHeight = getDimensionPixelSize(1, -1)
            seekBarMinMaxValue = if (selfHeight < selfWidth) selfHeight else selfWidth
            recycle()
        }

        // 获取SeekBarVertical自定义属性
        context.obtainStyledAttributes(
            attrs, R.styleable.SeekBarVertical
        ).apply {
            selfProgress = getInt(R.styleable.SeekBarVertical_UISeekBarProgress, -1)
            selfMax = getInt(R.styleable.SeekBarVertical_UISeekBarMax, -1)
            iconDrawable = getDrawable(R.styleable.SeekBarVertical_UISeekBarIcon)
            recycle()
        }
    }

    @SuppressLint("NewApi")
    private fun initView() {
        // 未设置宽高则直接返回
        if (selfWidth < 0 || selfHeight < 0) return

        parentView = View.inflate(context, R.layout.ui_seekbar_vertical, this) as ConstraintLayout

        // 设置控件整体宽、高
        (parentView.findViewById<ConstraintLayout>(R.id.parent).layoutParams as LayoutParams).apply {
            width = selfWidth
            height = selfHeight
        }

        // 设置SeekBar宽、高,以及progress和max值
        seekBar = parentView.findViewById<SeekBar>(R.id.seekbar).apply {
            (layoutParams as FrameLayout.LayoutParams).apply {
                width = selfHeight
                height = selfWidth
            }
            minHeight = seekBarMinMaxValue
            maxHeight = seekBarMinMaxValue
            minWidth = seekBarMinMaxValue
            maxWidth = seekBarMinMaxValue

            if (selfProgress >= 0) progress = selfProgress
            if (selfMax >= 0) max = selfMax
        }

        // 设置icon距离底部位置,以及icon背景
        icon = parentView.findViewById<View>(R.id.icon).apply {
            (layoutParams as LayoutParams).bottomMargin = seekBarMinMaxValue / 4
            iconDrawable?.let { setBackgroundDrawable(it) }
        }
    }

}

1.3.1 对外提供客制化

        public修饰放开parentView、seekBar以及icon,让应用开发者可自定义相关属性方法。

1.3.2 支持代码中动态添加使用

        提供构造方法constructor(context: Context, width: Int, height: Int),可在代码中动态使用SeekBarVertical。

1.3.3 布局依赖selfWidth/selfHeight

        以selfWidth与selfHeight为基准参考,代码中动态控制SeekBarVertical相关尺寸和位置。

2 使用竖直SeekBar

    <com.agg.ui.SeekBarVertical
        android:layout_width="96dp"
        android:layout_height="216dp"/>

        可在xml中指定相关属性值

        app:UISeekBarIcon="@drawable/ic_user_head"
        app:UISeekBarMax="12"
        app:UISeekBarProgress="3"

        也可在代码中指定

binding.seekBar.icon.setBackgroundResource(R.drawable.ic_user_head)
binding.seekBar.seekBar.max = 12
binding.seekBar.seekBar.progress = 3

        代码中动态添加SeekBarVertical

binding.root.addView(SeekBarVertical(this, 96, 216))

3 小结

        本文的实现依赖于Android11及以上的rotation属性,如果要兼容低版本Android,还是建议采用方案1的自定义View或方案2的canvas旋转+平移。


目录

0 前言

关于自定义View

1 实现竖直SeekBar

1.1 XML布局解析

1.1.1 套一层FrameLayout

1.1.2 SeekBar去除左右间距

1.1.3 SeekBar高度无法设置

1.1.4 SeekBar背景设置

1.1.5 底部View尺寸和距底部距离不硬编码

1.2 自定义样式属性与主题

1.2.1 自定义样式属性

1.2.2 自定义主题指定属性

1.3 编码实现

1.3.1 对外提供客制化

1.3.2 支持代码中动态添加使用

1.3.3 布局依赖selfWidth/selfHeight

2 使用竖直SeekBar

3 小结


垂直SeekBar在Android中的实现方法 SeekBar 是 Android 开发中常用的组件之一,通常用于让用户提供一种方式来选择一个数值,比如调整音量或亮度。它是一个水平的进度条,用户可以通过触摸滑块来拖动以选择值,也可以通过左右滑动来改变值。然而在某些场景中,开发者可能需要使用垂直SeekBar,这需要对原生组件进行自定义或使用第三方库来实现。创建自定义的类是实现垂直滑动条的第一步。在Android开发中,我们通常继承View类来创建自定义组件。以下是创建自定义类的基本代码:// 用于绘制// 滑块大小。 阅读详情

相关推荐

Android-VerticalSeekBar竖直滑动条用起来比较方便

VerticalSeekBar 竖直滑动条 ,用起来比较方便

SeekBar的几种常见用法

SeekBar的几种常见方法,SeekBar详解,SeekBar总结

aylr2015的博客 5518

android SeekBar 竖向

一个横竖向都可以的SeekBar 控件

Android 基础知识4-3.8 SeekBar(拖动条)详解

拖动条类似进度条,不同的是用户可以控制,比如,应用程序中用户可以对音效进行控制,这就可以使用拖动条来实现。由于拖动条可以被用户控制,所以需要对其进行事件监听,这就需要实现SeekBar.onSeekBarChangeListener接口。在SeekBar中共需要监听3个事件,分别是:数值的改变(onProgressChanged)、开始拖动(onStartTrackingTouch)、停止拖动(onStopTrackingTouch)。在onProgressChanged中我们可以得到当前数值的大小。

yyxhzdm的博客 1万+

Win11下CH340串口识别失败的终极排查指南:从驱动更新到硬件电路检查

本文提供了Windows 11系统下CH340串口芯片识别失败的全面排查指南。从驱动更新、系统设置等软件层面入手,逐步深入到USB线缆、电源测量等硬件连接检查,并重点剖析了硬件设计细节,如电源退耦电容容值对设备描述符请求的关键影响,最终帮助开发者系统性地定位并解决识别难题。

weixin_29174013的博客 592

macOS安装Cplex+yalmip

macOS安装Cplex+yalmip

DS 4248

Android SeekBar深度定制:从原理到实践,实现高度与样式精准控制

在Android UI开发中,自定义视图组件是提升应用视觉体验的关键环节。SeekBar作为用户交互的核心控件,其样式定制涉及Android视图系统的测量、布局与绘制原理。通过理解LayerDrawable的层级结构和NinePatch的可伸缩特性,开发者可以突破系统默认样式的限制,实现高度、颜色、滑块形状的精准控制。这项技术对于构建与设计语言高度统一的音乐播放器、视频编辑器、参数调节面板等场景具有重要价值。本文聚焦于SeekBar的progressDrawable机制与触摸区域优化,通过XML Shape

weixin_30896825的博客 325

手把手教你用STM32单片机控制双向可控硅调光(附完整代码+电路图)

本文提供了一套完整的STM32单片机控制双向可控硅实现灯光无级调光的实战方案。详细讲解了硬件电路设计,包括过零检测与隔离驱动,并剖析了基于定时器中断的软件核心逻辑,通过精准的相位角计算实现平滑的灯光强度控制。附有完整代码与电路图,适合嵌入式开发者实践。

weixin_29194255的博客 957

深入Oblique源码:Path绘制与三角函数实现斜切图片的完整原理

斜切图片效果正在成为 Android 界面设计中提升视觉层次感的流行手法:普通矩形图片的边缘被"削"成平行四边形或梯形,让卡片、横幅、轮播图瞬间拥有动感和个性。Oblique 正是一个专注于斜切图片显示的开源 Android 图片库,它的使命一句话说得很清楚——"With Oblique explore new styles of displaying images"(用 Oblique 探索图片

gitblog_00318的博客 389

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2670

WVP+ZLM国标平台实战:从设备注册失败到视频播放黑屏,我遇到的5个典型问题与解法

部署WVP+ZLM国标视频平台时,设备注册失败、视频播放黑屏等问题常常让运维人员头疼不已。本文将基于真实运维场景,剖析五个最具代表性的故障案例,提供从网络配置到版本兼容性的全链路解决方案。

weixin_33178839的博客 362

Android之SeekBar的简单使用

Android之SeekBar 一、简介 SeekBar意思为拖动条,是ProgressBar的一个子类。 在我们安卓的开发中也是应用非常的广泛。如音乐播放、音量条、播放进度条,等等。Android系统只提供了水平的,默认的样式,我们也可以根据自己需求自定义样式。 二、常用属性和方法 seekBar继承了ProgressBar,ProgressBar所支持的xml属性和方法都适用于seekBar,ProgressBar的使用可以看这篇博客Android之 ProgressBar的简单使用 这里介绍下最常用

Mq_sir的博客 1万+

8、Windows 部署ollama

一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,已被包括LangChain、Taskweaver等在内的多个热门项目高度集成。

Andy_shenzl的博客 1131

Android 之 SeekBar (拖动条)

本来还想着自定义下SeekBar的,后来想想,还是算了,涉及到自定义View的一些东西,可能初学者并 不了解,看起来也有点难度,关于自定义View的还是放到进阶那里吧,所以这里就只是简单的定制下SeekBar!txt_cur.setText("当前进度值:" + progress + " / 100 ");嘿嘿,这玩意是ProgressBar的子类耶,也就是ProgressBar的属性都可以用咯!= "@mipmap/sb_icon" //滑块的drawable。="70" //二级滑动条的进度。

leyang0910的博客 3691

PS射击游戏射线检测优化:原理、工程与全链路高性能实现

射线池:减少GC,提升批量检测效率。分层检测:先粗后细,远距离射击高效判定。批量检测:并行处理,适合大量射线场景。空间结构:进一步加速大场景检测。下面继续深入射线检测优化,补充更多实用细节和进阶技巧,包括空间分区加速、射线检测多线程/异步化、射线合并与分帧、射线池通用模板、常见性能陷阱与调优建议等。对于极端性能需求,可自定义轻量级物理系统,仅检测关键对象(如玩家、子弹),跳过复杂物理引擎。结合AABB、OBB、球体等简单碰撞体,射线-包围体检测极快。空间分区+分层检测是大场景射线优化核心。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 434

OpenClaw 股票自动化交易实践指南:从原理到实战的完整技术路径

量化交易策略的开发是一个系统工程,需要综合运用金融知识、编程技能和数据分析能力。OpenClaw通过引入提示词工程技术,大大降低了策略开发的技术门槛,使得更多投资者能够参与到量化交易中来。但技术只是工具,真正决定策略成败的是对市场的深刻理解和严格的风险管理。本章系统介绍了OpenClaw环境下的策略开发方法,从提示词驱动到传统代码实现,从参数优化到回测验证,涵盖了策略开发的完整流程。提示词驱动方式适合快速验证交易想法,传统代码方式适合实现复杂的定制逻辑,两种方式可以协同使用,发挥各自的优势。

lovely_yoshino的博客 5991

android 快速实现 垂直SeekBar(VerticalSeekBar)

【代码】android 快速实现 垂直SeekBar(VerticalSeekBar)

OneN的博客 1739

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android 垂直拖动条,垂直SeekBar实现

自定义垂直SeekBar及样式

Benlve的博客 2815

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SeekBar的简单使用

本篇文章主要是来学习UI控件中的seekbar拖动条使用,通常是伴随这视频或者音乐播放器一起使用的。

zijindanshutong的博客 2076

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android控件之SeekBar的用法总结

item Android:id=' @ Android:id/二次进度' Android:drawable=' @ drawable/bar _ dn '/自定义SeekBar的背景定义为:Android:progress drawable=' @ drawable/BG _ bar '。自定义SeekBar的滑块定义为:Android:thumb=' @ drawable/thumb _ bar '。' com/apk/RES/Android '选择器xmlns:Android=' http://模式。

fmz2222的博客 2601

Android自定义垂直 SeekBar

android 本身只有一个水平的 seekbar,开发需要使用垂直的seekbar就只能自己实现了,好在可以直接继承水平seekbar,修改几个重载事件即可。onDraw事件中旋转画布,由水平变垂直。measure事件中重新计算控件尺寸,对换宽高值。切记加上尺寸变更时的事件,变更对换宽高值。最后重载一下滑动事件,重新计算progress值。以上即可实现垂直的seekbar,但我在实际使用时,发现显示不出来,拉大尺寸发现本身是有显示出来的,但是位置什么的都不对,感觉内部padding值很大。自定义外观解决。

曲幽 5106

垂直进度条VerticalSeekBar

水平的进度条见多了,总会想见个垂直的进度条开开眼。今天咱就试试。 要说原理也简单,就是把宽高倒置,其他的理论上都不需要动,发现问题再补补也就行了。官方提供官方是提供了垂直进度条的例子源码的,位置在android-sdk-windows\sources\android-23\com\android\example\rscamera\VerticalSeekBar.java,当然首先你SDK中要有An

明光的博客 6049

在android里做一个竖着的seekbar

      工作繁忙,总想有机会停下来喘口气,整理一下思路,做一些积累,但是这样的机会很少。要做android的界面,基础的要求是熟悉那些内置的组件(prebuilt componments),而有时候这些组件是不够用的,这时候我们就需要自己写一个新的,或者修改内置的。这就要求我们了解更多知识,比如各个View是怎么画出来的,UI上各种事件是如何分发和处理的等等。这些我都计划写出来和大家分享,

demon的专栏 3万+

一起Talk Android吧(第五百四十八回:如何创建垂直版SeekBar)

本章回中主要介绍了垂直版SeekBar的概念和实现方法,并且通过文字结合代码的方式进行了讲解。

talk_8的专栏 1140

Android开发之如何自定义垂直方向的SeekBar

SeekBar进度条在项目开发过程中使用的太频繁了,比如媒体播放器当前播放的时间进度等。那么今天将对seekbar的使用做一个总结,后面写工作要用到直接过来copy就好。这边seekbar的使用分为横向和纵向两种显示方式。先上效果图,如下: 左边第一条是本人工作项目中EQ应用提取出来的,实现方式为自定义view继承自imageview来绘制完成,过程也是相当得简单,无非就是draw几张bitmap

啊sir的专栏 4438

Vertical (垂直) Seekbar

【代码】Vertical (垂直) Seekbar。

beyond_zhou的博客 352
上一篇: Kotlin 一劳永逸实现 TAG
下一篇: 再次理解Android账号管理体系
Swuagg
Swuagg 新星创作者: 移动开发技术领域 新星创作者: 移动开发技术领域 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄10年 2355粉丝 153原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值