android手机上实现竖直seekbar的EQ均衡器

     做音乐播放器,有时会要求EQ均衡器,但android默认的样式是水平的,这时就需要费点心思了。

     先是实现默认SeekBar样式的EQ均衡器:

   

    

      这是4.0以上默认样式的SeekBar,2.3或以下就像是进度条一样。

      要实现这样的效果,其实并不难,先贴上源码:

public class MainActivity extends Activity {
    private MediaPlayer mMediaPlayer;
    private Equalizer mEqualizer;
    private LinearLayout mLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        mLayout = new LinearLayout(this);
        mLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(mLayout);

        mMediaPlayer = new MediaPlayer();
        try {
            mMediaPlayer.setDataSource("/sdcard/陪我去流浪.mp3");
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        setEqualize();
    }

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    private void setEqualize() {
        mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
        mEqualizer.setEnabled(true);

        short bands = mEqualizer.getNumberOfBands();

        final short minEqualizer = mEqualizer.getBandLevelRange()[0];
        final short maxEqualizer = mEqualizer.getBandLevelRange()[1];

        for (short i = 0; i < bands; i++) {
            final short band = i;

            TextView freqTextView = new TextView(this);
            freqTextView.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));

            freqTextView.setGravity(Gravity.CENTER_HORIZONTAL);

            freqTextView
                    .setText((mEqualizer.getCenterFreq(band) / 1000) + "HZ");
            mLayout.addView(freqTextView);

            LinearLayout row = new LinearLayout(this);
            row.setOrientation(LinearLayout.HORIZONTAL);

            TextView minDbTextView = new TextView(this);
            minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));

            minDbTextView.setText((minEqualizer / 100) + " dB");

            TextView maxDbTextView = new TextView(this);
            maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));
            maxDbTextView.setText((maxEqualizer / 100) + " dB");

            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);

            SeekBar seekbar = new SeekBar(this);
            seekbar.setLayoutParams(layoutParams);
            seekbar.setMax(maxEqualizer - minEqualizer);
            seekbar.setProgress(mEqualizer.getBandLevel(band));
            seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }

                @TargetApi(Build.VERSION_CODES.GINGERBREAD)
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress,
                        boolean fromUser) {
                    // TODO Auto-generated method stub
                    mEqualizer.setBandLevel(band,
                            (short) (progress + minEqualizer));
                }
            });
            row.addView(minDbTextView);
            row.addView(seekbar);
            row.addView(maxDbTextView);
            mLayout.addView(row);
        }
    }

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if (isFinishing() && mMediaPlayer != null) {
            mMediaPlayer.release();
            mEqualizer.release();
            mMediaPlayer = null;
        }
    }
}

      这里我采用了手动设置Layout布局的方式,因为上面的Layout采用LinearLayout实现,并且每个SeekBar的属性设置都一样,考虑到SeekBar的数量较多,采用这个方式可能会更好点,至少我们不需要写太繁琐的Layout布局文件。
      撇开那些Layout的布局代码,我们看看最主要的部分:SeekBar和Equalizer的设置。

      android系统提供内置的Equalizer支持,我们可以直接声明并且使用。但必须注意,当我们在代码中使用Equalizer的时候,其实就是调整音量(EQ均衡器是改变音频使得声音发生变化,像是洪亮或者低沉)。所以,我们需要在我们的代码中声明这么一句:

setVolumeControlStream(AudioManager.STREAM_MUSIC);

      因为涉及到硬件方面的修改,我们需要权限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

      它允许我们进行全局的音频设置。
      我们再来看看这句:

mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());

      每个MediaPlayer都有自己独一无二的SessionId,我们需要将Equalizer附加到这个MediaPlayer上,就必须获取该SessionId。然后我们再创建一个优先级为0的Equalizer对象。所谓的优先级,是因为一个Equalizer engine可以被多个应用程序共享,所以我们必须设置优先级,优先级0代表该应用程序为正常级别。
     要想启动Equalizer,我们还必须这样子:

mEqualizer.setEnabled(true);

    这就是学过单片机的同学非常熟悉的"使能"。

    然后我们再获取支持的频谱:

 short bands = mEqualizer.getNumberOfBands();

    不同的硬件设备支持的频谱是不一样的,像是电脑能支持的频谱就比手机要多得多。
    接着就是获取频谱中的等级范围,我们只需要获取最低和最高即可。

final short minEqualizer = mEqualizer.getBandLevelRange()[0];
final short maxEqualizer = mEqualizer.getBandLevelRange()[1];

     接下来就是遍历频谱,设置SeekBar了:

seekbar.setMax(maxEqualizer - minEqualizer);
seekbar.setProgress(mEqualizer.getBandLevel(band));

seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {}

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {}

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        mEqualizer.setBandLevel(band, (short) (progress + minEqualizer));
    }
});

      我们必须设置SeekBar的最大进度范围,也就是进度顶端所代表的值。接着就是实现SeekBar进度改变时,Equalizer的音频也跟着相应的改变,这就需要监听SeekBar。
      好了,到了这里,基本的EQ均衡器已经实现了,但我们想要的并不是功能的实现,而是界面的实现(这往往是我们这些移动互联网开发者的恶梦,美工设计师们从来都没有考虑过我们要设计出他们的界面有时是多么难甚至不可能的一件事啊!)。

      既然默认的SeekBar样式无法满足我们的要求,我们只能自定义自己想要的SeekBar了。幸好,android还是提供了这种支持:只要继承自AbsSeekBr,我们就能得到自己想要的SeekBar了。

      依然先上源码:

public class VerticalSeekBar extends AbsSeekBar {
    private Drawable mThumb;
    private int height;
    private int width;

    public interface OnSeekBarChangeListener {
        void onProgressChanged(VerticalSeekBar VerticalSeekBar, int progress,
                boolean fromUser);

        void onStartTrackingTouch(VerticalSeekBar VerticalSeekBar);

        void onStopTrackingTouch(VerticalSeekBar VerticalSeekBar);
    }

    private OnSeekBarChangeListener mOnSeekBarChangeListener;

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

    public VerticalSeekBar(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.seekBarStyle);
    }

    public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
        mOnSeekBarChangeListener = l;

    }

    void onStartTrackingTouch() {
        if (mOnSeekBarChangeListener != null) {
            mOnSeekBarChangeListener.onStartTrackingTouch(this);
        }
    }

    void onStopTrackingTouch() {
        if (mOnSeekBarChangeListener != null) {
            mOnSeekBarChangeListener.onStopTrackingTouch(this);
        }
    }

    void onProgressRefresh(float scale, boolean fromUser) {
        Drawable thumb = mThumb;
        if (thumb != null) {
            setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE);
            invalidate();
        }
        if (mOnSeekBarChangeListener != null) {
            mOnSeekBarChangeListener.onProgressChanged(this, getProgress(),
                    fromUser);
        }
    }

    private void setThumbPos(int w, Drawable thumb, float scale, int gap) {
        int available = w + getPaddingLeft() - getPaddingRight();
        int thumbWidth = thumb.getIntrinsicWidth();
        int thumbHeight = thumb.getIntrinsicHeight();
        available -= thumbWidth;
        available += getThumbOffset() / 2;
        int thumbPos = (int) (scale * available);
        int topBound, bottomBound;
        if (gap == Integer.MIN_VALUE) {
            Rect oldBounds = thumb.getBounds();
            topBound = oldBounds.top;
            bottomBound = oldBounds.bottom;
        } else {
            topBound = gap;
            bottomBound = gap + thumbHeight;
        }
        thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);
    }

    protected void onDraw(Canvas c) {
        c.rotate(-90);
        c.translate(-height, 0);
        super.onDraw(c);
    }

    protected synchronized void onMeasure(int widthMeasureSpec,
            int heightMeasureSpec) {
        height = View.MeasureSpec.getSize(heightMeasureSpec) / 2;
        width = 50;
        this.setMeasuredDimension(width, height);
    }

    @Override
    public void setThumb(Drawable thumb) {
        mThumb = thumb;
        super.setThumb(thumb);
    }

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(h, w, oldw, oldh);
    }

    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled()) {
            return false;
        }
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setPressed(true);
            onStartTrackingTouch();
            trackTouchEvent(event);
            break;

        case MotionEvent.ACTION_MOVE:
            trackTouchEvent(event);
            attemptClaimDrag();
            break;

        case MotionEvent.ACTION_UP:
            trackTouchEvent(event);
            onStopTrackingTouch();
            setPressed(false);
            break;

        case MotionEvent.ACTION_CANCEL:
            onStopTrackingTouch();
            setPressed(false);
            break;
        }
        return true;
    }

    private void trackTouchEvent(MotionEvent event) {
        final int Height = getHeight();
        final int available = Height - getPaddingBottom() - getPaddingTop();
        int Y = (int) event.getY();
        float scale;
        float progress = 0;
        if (Y > Height - getPaddingBottom()) {
            scale = 0.0f;
        } else if (Y < getPaddingTop()) {
            scale = 1.0f;
        } else {
            scale = (float) (Height - getPaddingBottom() - Y)
                    / (float) available;
        }

        final int max = getMax();
        progress = scale * max;

        setProgress((int) progress);
    }

    private void attemptClaimDrag() {
        if (getParent() != null) {
            getParent().requestDisallowInterceptTouchEvent(true);
        }
    }

    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            KeyEvent newEvent = null;
            switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_DPAD_UP:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_RIGHT);
                break;
            case KeyEvent.KEYCODE_DPAD_DOWN:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_LEFT);
                break;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_DOWN);
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_UP);
                break;
            default:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        event.getKeyCode());
                break;
            }
            return newEvent.dispatch(this);
        }
        return false;
    }
}

       代码很长,但关键是我上面标记的几个方法。
       onDraw()该方法就是实现竖直SeekBar的关键。我们可以看到,关键就是那个c.rotate(-90),它实现了我们的竖直:通过反转-90度。setThumbPos()方法是为了调整thumb的大小,这个很重要,尤其是当我们开始排版的时候,thumb很可能因为布局的问题而显示不完全或者根本就不见了。onMeasure()针对的是进度条的设置。至于具体的大小怎样设置,得看大家自己的具体应用了。

       这个是实现的效果:

     

      前面的代码基本保持不变,只要将SeekBar改为VerticalSeekBar就可以了:

for (short i = 0; i < bands; i++) {
            final short band = i;
            int index = (int) i;
            VerticalSeekBar seekBar = (VerticalSeekBar) findViewById(seekBars[index]);
            seekBar.setMax(maxEqualizer - minEqualizer);
            seekBar.setProgress(mEqualizer.getBandLevel(band));

            seekBar.setOnSeekBarChangeListener(new VerticalSeekBar.OnSeekBarChangeListener() {

                @Override
                public void onProgressChanged(VerticalSeekBar VerticalSeekBar,
                        int progress, boolean fromUser) {
                    mEqualizer.setBandLevel(band,
                            (short) (progress + minEqualizer));

                }

                @Override
                public void onStartTrackingTouch(VerticalSeekBar VerticalSeekBar) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onStopTrackingTouch(VerticalSeekBar VerticalSeekBar) {
                    // TODO Auto-generated method stub

                }
            });

       为了实现我上面的布局效果,我这次使用了RelativeLayout布局文件,至于那些间距的调整,就留给读者们了。

      这样的效果还是不行的,因为有个致命的缺陷:android2.3的默认样式和android4.0的默认样式是不一样的!别看我上面的效果挺美观的,在android2.3上可不是这样。

      最好的解决方法就是替换默认样式。

      替换默认样式的方法很简单:在res目录下,新建drawable文件夹,然后我们在该目录下新建一个xml文件:

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

    <item android:id="@android:id/secondaryProgress">
        <clip android:drawable="@drawable/progress2" />
    </item>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/progress1" />
    </item>

</layer-list>

     我们可以使用layer-list来替换默认样式,secondaryProgress指的是我们进度条中剩下的进度,progress指的就是我们当前的进度。
     分别设置好它们的替换图片后,我们再在SeekBar中这样设置:

<com.example.eqpratice.VerticalSeekBar
            android:id="@+id/sec"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/fir"
            android:progressDrawable="@drawable/progress"
            android:secondaryProgress="100"
            android:thumb="@drawable/thumb" />

     这里android: secondaryProgress="100"设置的是我们thumb能达到的最大进度,这个是要设置的,不然会出现thumb超出进度条的情况。
     现在的效果如图:

    

        大家可以根据自己的需要,自定义自己想要的样式。

        因为是菜鸟,很多东西都是一笔带过,写得不好或者是有错的,还请各位大神指教。

     

     

     

        

   

安卓Seekbar自定义样式的开发 安卓自定义seekbar 阅读详情

相关推荐

android 自定义Seekbar,包括图片,背景颜色

android 自定义Seekbar,包括图片,背景颜色,网上的小例子

Android -- SeekBar(I)颜色,颜色设置

Android – SeekBar(I)颜色,颜色设置 <!--默认布局:使用代码设置其颜色--> <SeekBar android:id="@+id/bar_r" android:layout_width="255dp" android:layout_height="wrap_content"/> <!--直接设置进度条与滑块颜色--> <SeekBar android:id="@+id/bar_g" androi

8023的博客 5642

车载导航GPS欺骗

因此,如果我们能够模拟卫星信号,将模拟的信号通过信号发射装置发送给GPS传感器,那么就有可能实现欺骗GPS传感器获取虚假的位置信息,这种技术即SDR(软件无线电,Software Defined Radio)[2]。究其原因,在不使用时钟模块的条件下,HackRF发送信号的频率可能不十分精准,因此GPS传感器接收到信号之后可能无法正常解析GPS信号,因此时钟信号可能是HackRF进行GPS欺骗的关键。2)HackRF是否使用了时钟模块,时钟模块决定了信号发送频率的精准程度,对实验的成败也是至关重要的。

2503_90751789的博客 1324

Android控件篇 seekbar - 设置进度条颜色及渐变色

一、效果图 二、xml布局控件属性 <SeekBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:maxHeight="3.4dp" android:mi

圈池 4490

adams案例分析_案例1(麦弗逊悬架子系统创建)

本文字数3292字83图,建议阅读时间26分钟首先看下案例1的麦弗逊悬架数模结构就不细讲了,从数模上主要是获取硬点坐标(铰接点、安装点、参考点)及大部件结构(副车架、摆臂、转向节等实际运动过程中会产生变形的部件,在ADAMS Car中我们就可以用柔性体来搭建)再来回顾下上一篇讲到的模型元素1、Hardpoint——硬点(只有位置没有方向)2、Parameter Variable——参数...

weixin_39609407的博客 6476

告别懵圈!用CANoe手把手解析ISO15765多帧传输(附实战报文分析)

本文详细解析了ISO15765多帧传输协议在汽车电子诊断中的应用,通过CANoe实战演示了从首帧发送到流控协商再到连续帧传输的完整流程。文章包含嵌入式系统诊断协议的深度分析,特别适合UDS和CAN总线开发人员学习多帧传输机制及常见问题解决方案。

weixin_30813225的博客 281

Android中自定义SeekBar背景颜色,进度条颜色,滑块图片

目录目录 Android SeekBar常见问题 进度条颜色 设置进度条高度 设置滑块样式Android SeekBar常见问题在使用Android Seekbar大家可能经常遇到下面这几个问题: 如何设置Seekbar进度条的高度? 如何设置滑块的样式? 如何设置进度条的颜色和背景颜色? 接下来,针对这三个问题我会逐一作出解答。解答前,我们需要配置一个默认的Seekbar,样式代码如下:<Line

小一的专栏 5万+

从0到1搭建StarRocks3.4.1存算一体架构(VM 虚拟机版)

本文详细介绍了如何在VM虚拟机上从零搭建StarRocks 3.4.1存算一体架构。首先阐述了StarRocks作为高性能分布式SQL数据仓库的优势,重点讲解了其存算一体架构的设计原理。随后提供完整的安装指南,包括环境准备(3台CentOS 8虚拟机配置)、网络互通验证、Java环境配置、软件包解压安装等关键步骤。文章特别详细说明了FE和BE节点的配置文件修改(fe.conf和be.conf)以及必要的防火墙端口开放配置。通过图文并茂的方式,帮助开发者和运维人员快速掌握StarRocks集群部署方法,为后续

小 tom的博客 1329

android 颜色调节seekbar

Android 颜色调节 SeekBar 的实现 在 Android 开发中,SeekBar 是一种常用的控件,允许用户通过滑动条调节数值。当我们将 SeekBar 应用到颜色调节时,可以实现用户友好的颜色选择器,允许用户动态调整 RGB 颜色值。本文将为你详细讲解如何实现一个简单的颜色调节 SeekBar。 1. 项目结...

weixin_36123682的博客 514

Flowable前端可视化配置动态审批人:告别硬编码,实现部门领导、项目经理自动分配

本文详细介绍了Flowable前端可视化配置动态审批人的全栈解决方案,通过表达式分配、监听器分配等动态审批人机制,实现从硬编码到智能分配的转变。文章提供了前端扩展bpmn-js设计器、后端动态解析实现方案及性能优化建议,帮助企业应对组织架构变动,提升审批流程的灵活性和效率。

weixin_30352645的博客 473

群晖NAS搭建Git Server避坑指南:从SSH配置到权限管理的完整流程

本文提供了一份详尽的群晖NAS搭建Git Server实战指南。文章从启用并安全配置SSH服务入手,深入解析了用户权限体系设计、SSH连接与仓库初始化、客户端SSH密钥配置等核心步骤,并提供了常见错误排查与生产环境加固方案,帮助开发者成功构建私有、安全的代码托管平台。

rock5的博客 420

自定义SeekBar的高度设置

最近遇到了一个项目,其中用到了SeekBar这个控件,但是系统提供的样式无法满足现在的需求,只能去自定义样式, 但是我遇到的难题是thumb的大小如何定义,我的thumb大小被牢牢的限制在了滑动条里,这个如何解决呢? 这里用到了关键的两个属性: android:minHeight="" android:maxHeight="" android:minHeight控制的是SeekBa...

u011050129的博客 3878

第15章 AI 产品原型设计 —— 让 AI 成为你的产品经理

理解产品需求- 将模糊的想法转化为具体的原型方案生成高质量原型- 输出符合设计规范的 HTML 原型提供设计建议- 基于 UX 最佳实践给出优化建议维护原型文档- 自动更新原型说明和变更记录。

快乐的修补匠的专栏 502

android seekbar 背景颜色,Android Studio设置seekbar进度条颜色

一、简介:这里设置seekbar的进度条颜色,对应的属性如下:android:progressDrawable这里设置seekbar的按钮图片,对应的属性如下:android:thumb举例如下://这里设置seekbar的进度条颜色android:progressDrawable="@drawable/bg_seek_bar" / /这里是样式文件名或图片//这里设置seekbar的按钮图片an...

weixin_32944341的博客 2868

详解FreeRTOS:低功耗Tickless模式(高级篇—7)

FreeRTOS提供了一个叫做Tickless的低功耗模式,本篇博文我们就来学习一下如何使用这个Tickless模式。

不脱发的程序猿 1897

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android 自定义SeekBar带图片样式

1.主布局 <SeekBar style="@style/mySeekBar" android:layout_width="@dimen/dp_120" android:layout_height="@dimen/dp_14" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/dp_6" android:splitTrack="false" /> .

xige1995的博客 924

Devexpress16.2.6破解工具

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一起Talk Android吧(第四百五十八回:SeekBar补充用法一)

本章回中主要介绍了SeekBar的补充用法,在基本用法的基础上补充了两种用法:修改进度条背景色和修改进度条头部。

talk_8的专栏 813

Android自定义SeekBar样式,遇到的进度条高度问题

首先来看我的android:progressDrawable="@drawable/seek_progress_drawable",下面是seek_progress_drawable文件:<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/androi

拥抱世界 1万+

仿照利用android系统源码资源文件,修改SeekBar颜色 前景与背景

先看结果: 1.拖一个SeekBar控件,ProgressDrawable默认值@android:drawable/scrubber_progress_horizontal_holo_light 2.在anroidSDK里搜索scrubber_progress_horizontal_holo_light.xml,打开源码为 <?xml version="1.0" encodi...

chenhao0568的专栏 354

android中seekbar 常用属性列表,Android 中Seekbar详解及简单实例

Android 中Seekbar详解及简单实例做到音频播放和音乐播放时,大多数都要用到Seekbar。现在我先简单介绍下Seekbar的几个重要属性。android:max 设置值的大小 .android:thumb=”@drawable/” 显示的那个可拖动图标,如果没有设置该参数则为系统默认,如果自己需要重新定义,则将自己需要的图标存放在资源目录 /res/drawable下,然后调用即可.a...

weixin_42444974的博客 3496

android 开源seekbar,2019-01-21 Android UI之SeekBar实际开发中的问题与范例

本文结合网上资料和实际用到的功能,对Android SeekBar 做一点总结。其中重点是水平的进度条SeekBar 基本属性android:max:设置进度的最大值。android:progress:设置当前第一进度值。android:secondaryProgress:设置当前第二进度值。android:visibility:设置是否显示,默认显示。与setProgress(int)和incr...

weixin_42349469的博客 282

Android UI之自定义SeekBar

一、 自定义SeekBar第一个Seekbar 背景是颜色,thumb是图片。二、实现seek.xml:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_widt

chenliguan的博客 1812

SeekBar使用自定义Drawable作为thumb

SeekBar使用自定义Drawable作为thumb 文章目录SeekBar使用自定义Drawable作为thumb一、实现代码二、细节,以及问题1、onBoundsChange2、drawable刷新3、SeekBar两边有空隙4、SeekBar按住的时候有一小块圆形阴影三、遗留问题 工作中遇到一个需求,要在seekBar的thumb上显示文本,并且thumb还有特定的样式,如下图。考虑了一下之后,决定采用自定义Drawable作为thumb drawable。 一、实现代码 public cla

SywCache的博客 2107
上一篇: ios人脸识别: 建立OpenCV 框架
下一篇: Android AdapterView 源码分析以及其相关回收机制的分析
weixin_33832340
博客等级 码龄11年 5847粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值