仿照华为手机的系统自带天气预报的UI天气数值显示部分

效果图:

橙色部分是有渐变效果,图片上不大看的出来了,上面浅一点,下面深一点。

原理其实就是花了很多条短线:根据圆心和半径来确定每条线的x,y终点坐标,以及根据圆心和(半径-短线长度)来确定每条线的x,y起点坐标,然后起点到终点画线就可以了。

主要用到点三角函数的知识:

<span style="white-space:pre">  </span>/*** 根据半径和角度计算x坐标*/private float calculateX(float r, double angle) {angle = angle * ((2 * Math.PI) / 360);Log.i(TAG, "angle = " + angle + ",Math.sin(angle) = " + Math.sin(angle));double x = r * Math.sin(angle);double xFinal = centerX + x;return (float) xFinal;}/*** 根据半径和角度计算y坐标*/private float calculateY(float r, double angle) {angle = angle * ((2 * Math.PI) / 360);Log.i(TAG, "angle = " + angle + ",Math.cos(angle) = " + Math.cos(angle));double y = r * Math.cos(angle);double yFinal = centerY - y;return (float) yFinal;}

主要用到的类也就是Canvas、Paint、Matrix、SweepGradient(扫描渐变渲染效果)

贴上代码:

package com.cc.test.view;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/*** 线条圆圈控件(仿华为系统天气预报UI)* @author zhangyu* @date 2016-4-1*/
public class LineCircle extends View {private static final String TAG = "LineCircle";private float centerX, centerY;private int viewWidth, viewHeight;private Paint linePaint;private TextPaint whitePaint;// 有渐变颜色的旋转起止角度private float startAngle = 21, stopAngle = 123;// 圆半径 线长度private float r, l;private Shader shader, shaderWhite;//起止温度private int startTem = 19,stopTem = 24; public LineCircle(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}public LineCircle(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public LineCircle(Context context) {super(context);init(context);}private void init(Context context) {linePaint = new Paint();linePaint.setStrokeWidth(3);linePaint.setAntiAlias(true);whitePaint = new TextPaint();whitePaint.setColor(Color.WHITE);whitePaint.setStrokeWidth(4);whitePaint.setAntiAlias(true);}/*** 设置开始角度* 开始与结束角度内显示为渐变彩色,反映当前温度范围.* @param startAngle 开始角度* @return 设置成功返回true 否则返回false*/public boolean setStartAngle(float startAngle){if(startAngle >= 0 && startAngle <= 360){this.startAngle = startAngle;invalidate();return true;}else return false;}/*** 设置结束角度* 开始与结束角度内显示为渐变彩色,反映当前温度范围.* @param stopAngle 结束角度* @return 设置成功返回true 否则返回false*/public boolean setStopAngle(float stopAngle){if(stopAngle >= 0 && stopAngle <= 360){this.stopAngle = stopAngle;invalidate();return true;}else return false;}/*** 设置起始温度* @param startTem*/public void setStartTem(int startTem){this.startTem = startTem;invalidate();}/*** 设置截止温度* @param stopTem*/public void setStopTem(int stopTem){this.stopTem = stopTem;invalidate();}@Overrideprotected void onDraw(Canvas canvas) {for (double angle = 0; angle <= 360d; angle += 3.0d) {float xStart = calculateX(r, angle);float xStop = calculateX(r - l, angle);float yStart = calculateY(r, angle);float yStop = calculateY(r - l, angle);if (angle <= stopAngle && angle >= startAngle) {linePaint.setShader(shader);} elselinePaint.setShader(shaderWhite);if (angle == 204 || angle == 156) {linePaint.setStrokeWidth(2);float xStartL = calculateX(r * 1.05f, angle);float xStopL = calculateX((r - l), angle);float yStartL = calculateY(r * 1.05f, angle);float yStopL = calculateY((r - l), angle);canvas.drawLine(xStartL, yStartL, xStopL, yStopL, linePaint);       //底部两条较长的线} else if (!(angle < 204 && angle > 156)) {linePaint.setStrokeWidth(3);canvas.drawLine(xStart, yStart, xStop, yStop, linePaint);        //  画短线}Log.d(TAG, "angle = " + angle + ",xStart = " + xStart + ",xStop = " + xStop + ",yStart = " + yStart + ",yStop = " + yStop);}drawCenterTem(canvas);drawStartTem(canvas);drawStopTem(canvas);super.onDraw(canvas);}/*** 根据半径和角度计算x坐标*/private float calculateX(float r, double angle) {angle = angle * ((2 * Math.PI) / 360);Log.i(TAG, "angle = " + angle + ",Math.sin(angle) = " + Math.sin(angle));double x = r * Math.sin(angle);double xFinal = centerX + x;return (float) xFinal;}/*** 根据半径和角度计算y坐标*/private float calculateY(float r, double angle) {angle = angle * ((2 * Math.PI) / 360);Log.i(TAG, "angle = " + angle + ",Math.cos(angle) = " + Math.cos(angle));double y = r * Math.cos(angle);double yFinal = centerY - y;return (float) yFinal;}/*** 画中心位置温度* * @param canvas*/private void drawCenterTem(Canvas canvas) {whitePaint.setTextSize(r * 0.6f);whitePaint.setTypeface(Typeface.DEFAULT);canvas.drawText("24°", (centerX - r * 0.35f), (centerY + r * 0.3f), whitePaint);}/*** 画起始温度*/private void drawStartTem(Canvas canvas) {whitePaint.setTextSize(r * 0.1f);canvas.drawText(startTem + "°", calculateX(r * 1.05f, startAngle), calculateY(r * 1.05f, startAngle), whitePaint);}/*** 画截至温度*/private void drawStopTem(Canvas canvas) {whitePaint.setTextSize(r * 0.1f);canvas.drawText(stopTem + "°", calculateX(r * 1.05f, stopAngle), calculateY(r * 1.05f, stopAngle), whitePaint);}@Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {viewWidth = getWidth();viewHeight = getHeight();centerX = viewWidth / 2f;centerY = viewHeight / 2f;r = viewWidth * 0.4f;l = viewWidth * 0.05f;Log.v(TAG, "centerX = " + centerX + ",centerY = " + centerY);/* 设置渐变色 */shader = new SweepGradient(centerX, centerY, new int[] { Color.parseColor("#FFDAB5"), Color.parseColor("#E87400") }, null);shaderWhite = new SweepGradient(centerX, centerY, new int[] { Color.WHITE, Color.WHITE }, null);Matrix matrix = new Matrix();// 使用matrix改变渐变色起始位置,默认是在90度位置matrix.setRotate(45, centerX, centerY);shader.setLocalMatrix(matrix);linePaint.setShader(shader);invalidate();super.onWindowFocusChanged(hasWindowFocus);}
}

希望对大家有用,欢迎拍砖,欢迎指正!

仿华为系统自带天气预报UI---线条圆圈控件相关推荐

  1. iOS开发UI篇—UITableview控件使用小结

    iOS开发UI篇-UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...

  2. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇-UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) 1 #import <Foundation/Foundation.h&g ...

  3. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇-UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

  4. vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用

    vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用 参考文章: (1)vue的$nextTi ...

  5. Android:Socket客户端开发,Android 的Socket客户端优化,Android非UI线程修改控件程序崩溃的问题

    一.Android:Socket客户端开发 创建一个工程 我们要做的是按下按键之后,去往服务器 (服务器) 或者我们自己写的服务器 ,给他发送一些预定好的东西 然后打开操作界面 然后修改一下 你要发送 ...

  6. WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)

    原文:WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆) 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载.使用.重新发布,但务必保 ...

  7. android 带清除功能的输入框控件

    今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext;import a ...

  8. 想建一个带分隔条的label 控件;

    想建一个带分隔条的label 控件: Delphi / Windows SDK/API http://www.delphi2007.net/DelphiBase/html/delphi_2006120 ...

  9. Silverlight带关闭动画的内容控件,可移动的内容控件(一)

    本例给大家介绍两个自定义控件,一个有显示和关闭两种状态,在状态切换时有动画效果.另外一个是可以拖动的内容控件,可以制作能拖动的面板. A.带关闭动画的内容控件. .xaml View Code < ...

最新文章

  1. 深交所互动平台_怡达股份股价涨跌幅偏离大盘,深交所:啥原因?
  2. 计算广告 pdf_小学生PDF格式的试卷怎么编辑修改
  3. Courses hdu 1083(匹配)
  4. 为什么我不能关闭垃圾收集器?
  5. cmd编译可以通过执行没有结果_Go语言是如何完成编译的
  6. 8086汇编语言实现8253计时器对时且实时定点显示时间(全注释)
  7. 8_19 比赛总结 [暑假集训]
  8. 3.微服务:从设计到部署 --- 进程间通信
  9. vba mysql_VBA连接Mysql数据库
  10. 美标AWG与国标MM线径、电流换算对照表
  11. 学习笔记:12864液晶模块的详细使用
  12. 概率图模型-原理与技术 第二章 基础知识 学习笔记
  13. C#图像压缩相关方法总结
  14. 解决Latex中文PDF目录出现乱码问题
  15. Namesilo域名注册流程
  16. 几个重要的排列组合定理公式
  17. css 选父元素,CSS中模拟父元素选择器
  18. 浏览器被万恶的hao123锁定主页
  19. 在没有安装VC软件的电脑上也可以执行的exe文件
  20. TOEFL wordlist 8

热门文章

  1. conda 安装yaml环境中的各种坑
  2. mysql超市买东西的购物小票_Java-超市购物小票案例-详细介绍
  3. 全球第一位「半机械人」宣告死亡!再见,彼得2.0
  4. 事件绑定(onsubmit)表单提交
  5. 软件能力水平测试,2000年度软件资格水平考试情况
  6. 微信小程序开发uni-app 跨域处理 服务器搭建 仓库 VueX tabBar
  7. 在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字,求到指定位置有多少种走法
  8. USACO提交与洛谷或jzxx的区别和技巧
  9. 什么是线程锁和进程锁?什么是死锁,死锁产生的原因和解决锁的办法
  10. 华为鸿蒙电脑系统百度分享,实现万物互联 华为鸿蒙操作系统发布