Android收藏集UI效果仿写Android 自定义view

Android自定义可控制精度带刻度盘和波纹效果的炫酷SeekB

2018-03-13  本文已影响1033人  IT魔幻师

一、前言

最近项目里面需要用到多个seekbar并且需要显示不同的精度,于是参考了部分博客模仿华为的天气刻度盘添加了精度控制和自己定义的seekbar实现了如下效果(画面模糊是因为录制Gif图的工具导致的)。

本控件最低兼容到API16 更低的版本没有getThumb()函数

二、刻度盘部分

三、自定义seekbar

四、包装

刻度盘显示在PopupWindow中,当触摸Seekbar显示PopupWindow并且使得sin函数开始运动,通过进度值去控制进度盘的指示位置和水的深度以及颜色ARGB值,所以整个对刻度盘的控制都包装在Seekbar 的监听器里面:

    package com.hubin.scaleseekbar;
    
    /*
     *  @项目名:  ScaleSeekBar 
     *  @包名:    com.hubin.scaleseekbar
     *  @文件名:   WaveDialSeekbarListener
     *  @创建者:   胡英姿
     *  @创建时间:  2018-03-09 16:26
     *  @描述:    一个将SoftDialView 包装在里面的seekbar监听器
     */
    
    import android.graphics.Color;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.PopupWindow;
    import android.widget.SeekBar;
    
    import java.lang.ref.WeakReference;
    
    public class WaveDialSeekbarListener implements SeekBar.OnSeekBarChangeListener {
        private static final String TAG = "WaveDialSeekbarListener";
        private WeakReference<MainActivity> mActivityWeakReference;  //activity的弱应用
        private WaveDialView mWaveDialView;
        private PopupWindow mPopupWindow;
        private int mMaxProgress; //最大进度值
        private float mMaxShowValue; //最大显示值
        private String textUnit = ""; //右上角文字 单位
        private String textName = "";//中间要显示的文字名字
    
        private int precisionModeDefuale;//精度模式
        /**
         * 构造函数
         * @param activity activity的引用
         * @param maxProgress seekbar 的最大进度值
         * @param maxShowValue 刻度盘上需要显示的最大值
         * @param textName  中间要显示的文字名字
         * @param textUnit  右上角文字 单位
         * @param precisionModeDefuale 精度模式  整数,1位小数,2位小数
         */
        public WaveDialSeekbarListener(MainActivity activity, int maxProgress, float maxShowValue, String textName, String textUnit, int precisionModeDefuale) {
            mActivityWeakReference = new WeakReference(activity);
            mMaxProgress= maxProgress;
            mMaxShowValue = maxShowValue;
            this.textName = textName;
            this.textUnit = textUnit;
            this.precisionModeDefuale = precisionModeDefuale;
        }
    
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
          if (mWaveDialView != null) {
            mWaveDialView.setChange((float) progress*300/mMaxProgress);
            }
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            mWaveDialView = new WaveDialView(mActivityWeakReference.get());
            mWaveDialView.setInitConfig(precisionModeDefuale,mMaxShowValue,textName,textUnit);
            mWaveDialView.moveWaterLine();
            mWaveDialView.setOnAngleColorListener(onAngleColorListener);//颜色监听器 可自行设置
            //窗口宽度
            int windowWidth = mActivityWeakReference.get().getWindowManager().getDefaultDisplay().getWidth();
    
            mPopupWindow = new PopupWindow(mWaveDialView, windowWidth/2, ViewGroup
                    .LayoutParams.WRAP_CONTENT, true);
            mPopupWindow.showAtLocation(View.inflate(mActivityWeakReference.get(),R.layout.activity_main, null),
                    Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL, 0, 0);    //显示位置
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mWaveDialView=null;
            mPopupWindow.dismiss();
        }
    
    
    
        private WaveDialView.OnAngleColorListener onAngleColorListener=new WaveDialView.OnAngleColorListener() {
            @Override
            public void onAngleColorListener(int red, int green) {
                int c=Color.argb(150, red, green, 0);
               mActivityWeakReference.get().setBgColor(c);
            }
        };
    }

五、项目下载(记得Star)

https://github.com/CNHubin/ScaleSeekBar

上一篇下一篇

猜你喜欢

热点阅读