Android仿IOS屏幕亮度调节-自定义view系列

  • 功能简介
  • 主要实现步骤
  • xml相关属性设置
  • java代码
  • Android技术生活交流
  • 更多其他页面-自定义View-实用功能合集:[点击查看]
  • Github项目地址: 点击跳转,欢迎fork收藏
  • 仿IOS上下滑动音量调节看这篇 点击查看

功能简介

自绘制的仿ios的上下滑动改变亮度大小组件,虚拟机里不起作用,没有改变亮度,但是真实机器上有效果。

相关文章讲解:



主要实现步骤

1.定义一个音量比例mCurrentDrawBrightnessRate,该比例作为当前亮度展示在view里的高度。view总高度为1,音量比例处于0 ~ 1 之间

2.通过onTouchEvent方法获取手指在view内部上下移动的距离并重新计算音量比例。mCurrentDrawBrightnessRate= (当前音量*view总高度 + 上下移动距离)/ view总高度
3.用音量比例去绘制圆柱体前景颜色高度,高度为 音量比例 * view总高度。难点在于如何绘制前景颜色贴合背景,可以看见白色区域是被灰色背景切割的,即使是圆弧的区域也是。这里用到了setXfermode方法,
4.画亮度的太阳图标,太阳图标圆心和光芒皆会随着亮度的提高而扩大,反之则相反。
5.详细步骤看代码,(完整代码可以看github项目)另外该view长宽已经写死,没有进行多余的适配


xml相关属性设置

属性名 介绍
iosColumnAudioView_setAudioStreamType 设置想要改变的声音模式
iosColumnAudioView_setColorBackground 圆柱体底部背景颜色
iosColumnBrightnessView_setColorBright 圆柱体内部颜色,代表亮度大小
iosColumnAudioView_setRadiusXY 圆柱体的圆弧
iosColumnAudioView_setTextSize 亮度字体大小
iosColumnAudioView_setTextColor 亮度字体颜色
iosColumnAudioView_setTextHeight 亮度字体高度
iosColumnBrightnessView_setIsDrawTextBright 是否绘制亮度字体
iosColumnBrightnessView_setIsDrawDrawableBright 是否绘制亮度图标
iosColumnBrightnessView_setBrightnessColor 亮度图标颜色

java代码

/*** 作者:游丰泽* 简介:仿ios风格的亮度控制view* CSDN: https://blog.csdn.net/ruiruiddd/article/details/117288583* GITHUB: https://github.com/FENGZEYOU123/Android_IosAdjustView* Android技术生活-QQ交流群:723592501*/
public class IosColumnBrightnessView extends View {private Context mContext;//日志TAGprivate static final String TAG = IosColumnBrightnessView.class.getName();//系统亮度监听private BrightnessObserver mBrightnessObserver = null;//当前圆心最大半径private float mCircleMaxRadius = 0;//当前圆心最小半径private float mCircleMinRadius = 0;//当前圆心边长private float mCircleMaxWidth = 0;//当前UI高度与view高度的比例private double mCurrentDrawBrightnessRate = 0;//系统最大亮度index-默认255private final int mMaxBrightness = 255;//记录按压时手指相对于组件view的高度private float mDownY;//手指移动的距离,视为亮度调整private float mMoveDistance;//系统audio管理private AudioManager mAudioManager;//当前亮度文字数字private String mTextLoud ="";//画笔private Paint mPaint;//位置private RectF mRectF;//当前Canvas LayerIdprivate int layerId = 0;//亮度图标marginprivate int mRectBrightnessDrawableMargin =10;//亮度图标粗细private final static int mRectBrightnessDrawableWidth =4;/*** 设置圆弧度数-xml-iosColumnAudioView_setRadiusXY*/private float mRXY=40;/*** 设置当前亮度颜色-xml-iosColumnAudioView_setColorLoud*/private int mColorLoud = Color.parseColor("#ECECEC");/*** 设置组件背景颜色-xml-iosColumnAudioView_setColorBackground*/private int mColorBackground = Color.parseColor("#898989");/*** 设置是否画亮度文字-iosColumnAudioView_setIsDrawTextVolume* @param context*/private boolean mIsDrawTextVolume = true;/*** 设置文字大小-xml-iosColumnAudioView_setTextSize*/private float mTextSize = 15;/*** 设置文字颜色-xml-iosColumnAudioView_setTextColor*/private int mTextColor = Color.BLACK;/*** 设置文字高度-xml-iosColumnAudioView_setTextHeight* @param context*/private int mTextHeight = -1;/*** 设置是否画亮度图标-iosColumnAudioView_setIsDrawDrawableVolume* @param context*/private boolean mIsDrawDrawableVolume = true;/*** 设置亮度圆弧颜色-xml-iosColumnAudioView_setColorVolume*/private int mColorVolume = Color.DKGRAY;//固定组件高度长度,这里不做适配,可自行修改private int mViewHeight = 150, mViewWeight=50;public IosColumnBrightnessView(Context context) {super(context);initial(context);}public IosColumnBrightnessView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mTextSize = sp2px(context,mTextSize);TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.IosColumnBrightnessView);mColorBackground = typedArray.getColor(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setColorBackground,mColorBackground);mColorLoud = typedArray.getColor(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setColorBright,mColorLoud);mRXY = typedArray.getDimension(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setRadiusXY, mRXY);mTextSize = typedArray.getDimension(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setTextSize,mTextSize);mTextColor = typedArray.getColor(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setTextColor,mTextColor);mTextHeight = typedArray.getInt(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setTextHeight,mTextHeight);mIsDrawTextVolume = typedArray.getBoolean(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setIsDrawTextBright,mIsDrawTextVolume);mIsDrawDrawableVolume = typedArray.getBoolean(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setIsDrawDrawableBright,mIsDrawDrawableVolume);mColorVolume = typedArray.getColor(R.styleable.IosColumnBrightnessView_iosColumnBrightnessView_setBrightnessColor, mColorVolume);typedArray.recycle();initial(context);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mRectBrightnessDrawableMargin = MeasureSpec.getSize(widthMeasureSpec)/10;//固定组件高度长度,这里不做适配,可自行修改setMeasuredDimension(dp2px(mContext,mViewWeight),dp2px(mContext,mViewHeight));}private void initial(Context context){mContext=context;mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);mCurrentDrawBrightnessRate = getCalculateBrightnessRate();mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setAntiAlias(true);mPaint.setDither(true);mRectF = new RectF();setWillNotDraw(false);setBackgroundColor(Color.TRANSPARENT);mPaint.setTextSize(mTextSize);getPermission();stopAutoBrightness(mContext);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN:mDownY=event.getY();break;case MotionEvent.ACTION_MOVE:mMoveDistance = mDownY - event.getY();calculateLoudRate();mDownY=event.getY();break;case MotionEvent.ACTION_UP:break;default:break;}refreshAll();return true;}/*** 更新所有内容-ui-系统亮度*/private void refreshAll(){setSystemBrightness((int)(mCurrentDrawBrightnessRate * mMaxBrightness));refreshUI();}/*** 刷新UI*/public void refreshUI(){invalidate();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);layerId = canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), null, Canvas.ALL_SAVE_FLAG);onDrawBackground(canvas); //画背景onDrawFront(canvas); //画当前亮度前景表示当前多大亮度onDrawText(canvas); //画文字onDrawSunCircle(canvas);//画底部图标圆心canvas.restoreToCount(layerId);}/*** 计算手指移动后亮度UI占比大小,视其为亮度大小*/private void calculateLoudRate(){mCurrentDrawBrightnessRate = ( getHeight() * mCurrentDrawBrightnessRate + mMoveDistance) /  getHeight();if(mCurrentDrawBrightnessRate >=1){mCurrentDrawBrightnessRate =1;}if(mCurrentDrawBrightnessRate <=0){mCurrentDrawBrightnessRate =0;}}/*** 画圆弧背景* @param canvas*/private void onDrawBackground(Canvas canvas){mPaint.setStyle(Paint.Style.FILL);mPaint.setColor(mColorBackground );mRectF.left=0;mRectF.top=0;mRectF.right=canvas.getWidth();mRectF.bottom=canvas.getHeight();canvas.drawRoundRect(mRectF,mRXY,mRXY,mPaint);}/*** 画亮度背景-方形-随手势上下滑动而变化用来显示亮度大小* @param canvas*/private void onDrawFront(Canvas canvas){mPaint.setStyle(Paint.Style.FILL);mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));mPaint.setColor(mColorLoud);mRectF.left=0;mRectF.top=(canvas.getHeight()-(int)(canvas.getHeight() * mCurrentDrawBrightnessRate));mRectF.right=canvas.getWidth();mRectF.bottom=canvas.getHeight();canvas.drawRect(mRectF,mPaint);mPaint.setXfermode(null);}/*** 画文字-展示当前语音大小* @param canvas*/private void onDrawText(Canvas canvas){if(mIsDrawTextVolume) { //如果开启了则开始绘制mPaint.setStyle(Paint.Style.FILL);mTextLoud = "" + (int) (mCurrentDrawBrightnessRate * 100);mPaint.setColor(mTextColor);canvas.drawText(mTextLoud, (canvas.getWidth() / 2 - mPaint.measureText(mTextLoud) / 2), mTextHeight >= 0 ? mTextHeight : getHeight() / 6, mPaint);}}/*** 画亮度图标-太阳圆心*/private void onDrawSunCircle(Canvas canvas){if(mIsDrawDrawableVolume){ //如果开启了则开始绘制mPaint.setStyle(Paint.Style.FILL);mPaint.setStrokeWidth(mRectBrightnessDrawableWidth);mPaint.setColor(mColorVolume);mCircleMaxRadius = (float) (Math.sqrt(canvas.getWidth()) * 1.5);mCircleMinRadius = (float) (Math.sqrt(canvas.getWidth()) * 1);mCircleMaxWidth = (float) mCurrentDrawBrightnessRate * (mCircleMaxRadius-mCircleMinRadius)+mCircleMinRadius;canvas.drawCircle(canvas.getWidth()/2,(float) (canvas.getHeight()*0.8- mRectBrightnessDrawableMargin), mCircleMaxWidth,mPaint);onDrawSunRays(canvas,canvas.getWidth()/2,(float) (canvas.getHeight()*0.8- mRectBrightnessDrawableMargin));}}/*** 画亮度图标-太阳光芒*/private void onDrawSunRays(Canvas canvas,float cx,float cy){mPaint.setStrokeCap(Paint.Cap.ROUND); // 定义线段断电形状为圆头//绘制时刻度canvas.translate(cx,cy);for (int i = 0; i < 10; i++) {canvas.drawLine(mCircleMaxWidth, mCircleMaxWidth, (float)(mCircleMaxWidth+5* mCurrentDrawBrightnessRate),(float)( mCircleMaxWidth+5* mCurrentDrawBrightnessRate), mPaint);canvas.rotate(36);}}/*** 监听view视图在window里时,监听系统亮度*/@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();if(mContext != null) {mBrightnessObserver = new BrightnessObserver(mContext, new Handler(Looper.getMainLooper()));}}/*** 监听view视图从window里抽离的时,取消广播的注册*/@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();if(null != mBrightnessObserver) {mBrightnessObserver.unregister();}}/*** 监听亮度改变*/private class BrightnessObserver extends ContentObserver {private Context mContext;public BrightnessObserver(Context context, Handler handler) {super(handler);this.mContext =context;register();}//注册监听public void register(){Uri brightnessUri = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);mContext.getContentResolver().registerContentObserver(brightnessUri, true,this);}//取消注册监听public void unregister(){mContext.getContentResolver().unregisterContentObserver(this);}@Overridepublic void onChange(boolean selfChange) {//selfChange 一直是false,无法区分是自己手动改变还是通过系统设置调节,有bug。super.onChange(selfChange);}}/*** 改变当前系统亮度* @return*/public void setSystemBrightness(int brightness) {if(null != mContext) {if(brightness>=mMaxBrightness){brightness=mMaxBrightness;}if(brightness<=0){brightness=0;}Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,brightness);}}/*** 获取当前系统亮度* @return*/public int getSystemBrightness(){if(null != mContext) {try {return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}}return 0;}/*** 计算亮度比例*/private double getCalculateBrightnessRate(){return (double) getSystemBrightness()/ mMaxBrightness;}/*** 根据手机的分辨率从 dp 的单位 转成为 px(像素)*/public static int dp2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** 将sp值转换为px值,保证文字大小不变*/public int sp2px(Context context, float spValue) {final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}/****/private void getPermission(){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.System.canWrite(mContext)) {Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);intent.setData(Uri.parse("package:" + mContext.getPackageName()));intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(intent);} else {// 申请权限后做的操作}}}/*** 停止自动亮度调节*/private void stopAutoBrightness(Context context) {Settings.System.putInt(context.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);}}

Android技术生活交流

微信


Android仿IOS屏幕亮度调节-自定义view系列(5)相关推荐

  1. Android仿IOS解锁密码界面-自定义view系列(6)

    Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...

  2. Android安卓仿IOS音量调节-自定义view系列(4)

    Android安卓仿IOS音量调节-自定义view系列 功能简介 主要实现步骤 xml相关属性设置 java代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击查看 Gi ...

  3. Android 仿芝麻信用进度条,自定义View仿支付宝芝麻信用分仪表盘效果

    image 前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. 截图 这是我做的效果,还是有点差距的,嘿嘿. ...

  4. android仿微信雷达 头像效果 自定义view

    ScreeningRadarView public class ScreeningRadarView extends View {// 定义画笔Paint paint;float radiusDiff ...

  5. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

  6. Android仿IOS吸边弹簧阻尼移动组件SpringMovingView-自定义view系列(3)

    () Android仿ios吸边弹簧阻尼效果的移动组件SpringMovingView 功能简介 Android技术生活交流 Gif演示 实现步骤 java代码 Android技术生活交流 更多其他页 ...

  7. android rebound平移,Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout

    Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout 前言 IOS 拖拽回弹给用户的体验不得不赞然后 Android 原生的 API 各种不支持, 于是乎出现的很多仿 IO ...

  8. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  9. android 密码解锁程序,android 仿ios数字密码解锁界面的实例

    如下所示: 每个Android开发人员都知道,现在android的解锁最常用的就是九宫格解锁,ios的解锁常用的是数字密码解锁.而我们在开发工程中,很多时候,都需要android和ios进行结合.有的 ...

  10. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

最新文章

  1. 植物根际微生物组也有昼夜节律
  2. sourcetree 卡顿_Android卡顿性能监测方案对比
  3. 黑马程序员_Java基础面向对象
  4. 简体中文Win7打开简体中文chm中文乱码解决方法
  5. 外贸电商ERP都有哪些值得用?
  6. IP记录Linux所有用户操作日志的方法(附脚本)
  7. 我的世界java版gamemode指令_【服务器相关】【求助!】关于服务器中使用gamemode等命令错误。...
  8. 拷贝sys文件到另一个服务器,服务器文件拷贝到其他服务器
  9. 单片机C语言程序设计实训100例基于8051+Proteus仿真
  10. 网络盘的计算机密码是什么,如何让win7映射网络驱动器记住密码
  11. 常用三角公式、变形及图形
  12. PADS VX2.8 原理图图页的添加与名称修改的方法
  13. multism中ui和uo应该怎么表示_Multisim在模拟与数字电子技术中的应用(最终版)最新版...
  14. redis中以层级关系、目录形式存储数据
  15. eclipse打开时报错:
  16. WebRequest 类
  17. java毕业设计鸿鹄教育培训(附源码、数据库)
  18. 企业终端安全问题的痛点分析
  19. Reinforced History Backtracking for Conversational Question Answering论文翻译
  20. 最大熵阈值python_【6】python-opencv3教程:阈值分割(全阈值分割,局部阈值分割,直方图技术法,熵算法,自适应算法,Otsu算法)...

热门文章

  1. java 1.5.0 gcj_java gcj调试
  2. Expandable TabBar
  3. echop 验证码不正确的解决办法
  4. 扬天t4900d u盘linux,联想扬天T4900d台式电脑u盘启动设置方法
  5. 代码里的Override和Overload
  6. 中国大数据行业发展趋势
  7. 如何同时对多个 Word 文档批量插入页眉页脚、修改页眉页脚以及添加页码
  8. Word:表格中绘制斜线表头
  9. 用计算机清点木材的数量,计算机在木材工业中的应用.doc
  10. java 数据库异常,数据库常见异常