- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个设备管理应用程序。我想在 Activity 中显示温度计并使用实时数据更新温度值。我得到了实时数据部分,但我不知道如何绘制温度计。有什么图书馆可以用来解决我的问题吗?
最佳答案
这是温度计 View
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class Thermometer extends View {
private float outerCircleRadius, outerRectRadius;
private Paint outerPaint;
private float middleCircleRadius, middleRectRadius;
private Paint middlePaint;
private float innerCircleRadius, innerRectRadius;
private Paint innerPaint;
private Paint degreePaint, graduationPaint;
private static final int GRADUATION_TEXT_SIZE = 16; // in sp
private static float DEGREE_WIDTH = 30;
private static final int NB_GRADUATIONS = 8;
public static final float MAX_TEMP = 50, MIN_TEMP = -30;
private static final float RANGE_TEMP = 80;
private static final int NB_GRADUATIONS_F = 8;
private static final float MAX_TEMP_F = 120, MIN_TEMP_F = -30;
private static final float RANGE_TEMP_F = 150;
private int nbGraduations = NB_GRADUATIONS;
private float maxTemp = MAX_TEMP;
private float minTemp = MIN_TEMP;
private float rangeTemp = RANGE_TEMP;
private float currentTemp = MIN_TEMP;
private Rect rect = new Rect();
public Thermometer(Context context) {
super(context);
init(context, null);
}
public Thermometer(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
public Thermometer(Context context, AttributeSet attrs, int defStyleAttr) {
super (context, attrs, defStyleAttr);
init(context, attrs);
}
public void setCurrentTemp(float currentTemp) {
if (currentTemp > maxTemp) {
this.currentTemp = maxTemp;
} else if (currentTemp < minTemp) {
this.currentTemp = minTemp;
} else {
this.currentTemp = currentTemp;
}
invalidate();
}
public float getMinTemp() {
return minTemp;
}
public void init(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Thermometer);
outerCircleRadius = typedArray.getDimension(R.styleable.Thermometer_radius, 20f);
int outerColor = typedArray.getColor(R.styleable.Thermometer_outerColor, Color.GRAY);
int middleColor = typedArray.getColor(R.styleable.Thermometer_middleColor, Color.WHITE);
int innerColor = typedArray.getColor(R.styleable.Thermometer_innerColor, Color.RED);
typedArray.recycle();
outerRectRadius = outerCircleRadius / 2;
outerPaint = new Paint();
outerPaint.setColor(outerColor);
outerPaint.setStyle(Paint.Style.FILL);
middleCircleRadius = outerCircleRadius - 5;
middleRectRadius = outerRectRadius - 5;
middlePaint = new Paint();
middlePaint.setColor(middleColor);
middlePaint.setStyle(Paint.Style.FILL);
innerCircleRadius = middleCircleRadius - middleCircleRadius / 6;
innerRectRadius = middleRectRadius - middleRectRadius / 6;
innerPaint = new Paint();
innerPaint.setColor(innerColor);
innerPaint.setStyle(Paint.Style.FILL);
DEGREE_WIDTH = middleCircleRadius / 8;
degreePaint = new Paint();
degreePaint.setStrokeWidth(middleCircleRadius / 16);
degreePaint.setColor(outerColor);
degreePaint.setStyle(Paint.Style.FILL);
graduationPaint = new Paint();
graduationPaint.setColor(outerColor);
graduationPaint.setStyle(Paint.Style.FILL);
graduationPaint.setAntiAlias(true);
graduationPaint.setTextSize(Utils.convertDpToPixel(GRADUATION_TEXT_SIZE, getContext()));
}
public void changeUnit(boolean isCelsius) {
if (isCelsius) {
nbGraduations = NB_GRADUATIONS;
maxTemp = MAX_TEMP;
minTemp = MIN_TEMP;
rangeTemp = RANGE_TEMP;
} else {
nbGraduations = NB_GRADUATIONS_F;
maxTemp = MAX_TEMP_F;
minTemp = MIN_TEMP_F;
rangeTemp = RANGE_TEMP_F;
}
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int height = getHeight();
int width = getWidth();
int circleCenterX = width / 2;
float circleCenterY = height - outerCircleRadius;
float outerStartY = 0;
float middleStartY = outerStartY + 5;
float innerEffectStartY = middleStartY + middleRectRadius + 10;
float innerEffectEndY = circleCenterY - outerCircleRadius - 10;
float innerRectHeight = innerEffectEndY - innerEffectStartY;
float innerStartY = innerEffectStartY + (maxTemp - currentTemp) / rangeTemp * innerRectHeight;
RectF outerRect = new RectF();
outerRect.left = circleCenterX - outerRectRadius;
outerRect.top = outerStartY;in
outerRect.right = circleCenterX + outerRectRadius;
outerRect.bottom = circleCenterY;
canvas.drawRoundRect(outerRect, outerRectRadius, outerRectRadius, outerPaint);
canvas.drawCircle(circleCenterX, circleCenterY, outerCircleRadius, outerPaint);
RectF middleRect = new RectF();
middleRect.left = circleCenterX - middleRectRadius;
middleRect.top = middleStartY;
middleRect.right = circleCenterX + middleRectRadius;
middleRect.bottom = circleCenterY;
canvas.drawRoundRect(middleRect, middleRectRadius, middleRectRadius, middlePaint);
canvas.drawCircle(circleCenterX, circleCenterY, middleCircleRadius, middlePaint);
canvas.drawRect(circleCenterX - innerRectRadius, innerStartY, circleCenterX + innerRectRadius, circleCenterY, innerPaint);
canvas.drawCircle(circleCenterX, circleCenterY, innerCircleRadius, innerPaint);
float tmp = innerEffectStartY;
float startGraduation = maxTemp;
float inc = rangeTemp / nbGraduations;
while (tmp <= innerEffectEndY) {
canvas.drawLine(circleCenterX - outerRectRadius - DEGREE_WIDTH, tmp, circleCenterX - outerRectRadius, tmp, degreePaint);
String txt = ((int) startGraduation) + "°";
graduationPaint.getTextBounds(txt, 0, txt.length(), rect);
float textWidth = rect.width();
float textHeight = rect.height();
canvas.drawText(((int) startGraduation) + "°", circleCenterX - outerRectRadius - DEGREE_WIDTH - textWidth - DEGREE_WIDTH * 1.5f,
tmp + textHeight / 2, graduationPaint);
tmp += (innerEffectEndY - innerEffectStartY) / nbGraduations;
startGraduation -= inc;
}
}
}
来源:@ssaurel的这篇文章在 medium.com
如果你想使用库 This library可以帮到你
示例 gif
另一个图书馆:github.com
关于android - 如何在 android Activity 中绘制温度计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13510513/
我学习 SDL 二维编程已有一段时间了,现在我想创建一个结合使用 SDL 和 OpenGL 的程序。我是这样设置的: SDL_Init(SDL_INIT_VIDEO); window = SDL_Cr
尝试查找可在地块中使用的不同类型项目的列表 来自不同样本的投影类型: projection = list(type = "equirectangular") projection = list(typ
我正在尝试使用 Java Graphics API 绘制 GIF,但无法使用下面的代码成功绘制 GIF。仅绘制 GIF 的第一张图像或缩略图,但不播放。 public void paintCompon
我目前正在使用 JFrame 并尝试绘制一个矩形,但我不知道如何执行代码 paint(Graphics g),如何获取 Graphics 对象? package com.raggaer.frame;
这个领域的新手,希望得到一些帮助。 我有一个"Missile.java" 类,我在那里画东西。我想绘制一个 ImageView,我正在使用以下代码: ImageView v = (ImageView)
下面列出了圆形的例子 这是我的 JavaScript 代码。 最佳答案 假设您的 randomColor 是正确的,您只需要: 从 canvas.onclick 中移除 context.clearR
我在绘制和缩放 ImageView 时遇到问题。请帮帮我.. 当我画一些东西然后拖动或缩放图像时 - 绘图保留在原处,如您在屏幕截图中所见。而且我只需要简单地在图片上绘图,并且可以缩放和拖动这张图片。
我们可以在形式之外绘制图像和文本...我的意思是在字面上... 我知道问这个问题很愚蠢但是我们能不能... 最佳答案 您可以通过创建表单并将其 TransparentColor 属性设置为背景色来“作
我在绘制/布局期间收到 3 个对象分配警告 super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paint textPaint = new Pai
我有一个示例时间序列数据框: df = pd.DataFrame({'year':'1990','1991','1992','1993','1994','1995','1996',
我试图想出一种简洁的方法来绘制 R 数据框中所有列的 GridView 。问题是我的数据框中既有离散值又有数值。为简单起见,我们可以使用 R 提供的名为 iris 的示例数据集。我会使用 par(mf
我有一个由 10 列和 50 行组成的 data.frame。我使用 apply 函数逐列计算密度函数。现在我想绘制我一次计算的密度。 换句话说,而不是绘图... plot(den[[1]]) plo
我想知道我们如何才能在第一个和第二个组件之外绘制个人,如下所示: 最佳答案 这可能有效: pc.cr <- princomp(USArrests, cor = TRUE) pairs(pc.cr$lo
我是Pandas和matplotlib的新手,想绘制此DataFrame season won team matches pct_won 0 20
我正在尝试为 distplot 子图编写一个 for 循环。 我有一个包含许多不同长度列的数据框。 (不包括 NaN 值) fig = make_subplots( rows=len(asse
我想创建一个具有密度的 3d 图。 我使用函数 density 首先为特定的 x 值创建一个二维图,然后该函数创建密度并将它们放入 y 变量中。现在我有第二组 x 值并将其再次放入密度函数中,然后我得
全部, 我一直在研究全局所有 MTB 步道的索引。我是 Python 人,所以对于所有涉及的步骤,我都尝试使用 Python 模块。 我能够像这样从 OSM 立交桥 API 中获取关系: from O
我正在使用 e1071 包中的支持向量机对我的数据进行分类,并希望可视化机器实际如何进行分类。但是,在使用 plot.svm 函数时,出现无法解决的错误。 脚本: library("e1071") d
我制作了以下图表,它是使用 xts 对象创建的。 我使用的代码很简单 plot(graphTS1$CCLL, type = "l", las = 2, ylab = "(c)\nCC for I
在绘制状态图时,您如何知道哪些状态放在框中,哪些状态用于转换箭头?我注意到转换也是状态。 我正在查看 this page 上的图 1 : 最佳答案 转换不是状态。转换是将对象从一种状态移动到下一种状态
我是一名优秀的程序员,十分优秀!