android 电平信号状态识别View平局

android 电平信号状态识别View平局

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

1、前言

级信号状态View在今天的Android系统是常见。状态的图标就很的经典,有几种状态,到了快没电的时候有些还会闪烁提示用户充电;还有的就是一些地图App的GPS信号强度的提示。Wifi信号强度的也有一些,反正应用场景大概就是这样。

2、实现目标效果图

废话别说这么多,直接上干货看图说话

android 电平信号状态识别View平局

我这个实现的是4种状态的View

1、没有中间显示条的表示空状态

2、有一个红色小圆信号低的状态

3、有一个黄色椭圆的表示一般状态

4、充满绿条的表示良好的状态

在这个View种仅仅给出三个等级的设置,当设置为一等级时。也就是显示仅仅有一个红色的View,然后这个红色的小球隔一段时间闪一次,提示用户。

其它等级就是一个简单的画图显示。

3、实现思路

事实上实现过程很easy,仅仅要简单的画图即可了,画布类的canvas.drawRoundRect方法能够画圆角的长方形,所以能够用这种方法画出白色背景框。然后在绘制两个,一个黄色的和绿色的,仅仅要控制一下大小和填充模式。红色的用一个canvas.drawCircle搞定,然后就剩下这个闪烁了,刚開始还不太好想怎么搞,事实上我们开一个线程在后台,然后隔一个时间更新一下View的状态然后又一次绘制一下就能够实现跳动的效果。

4、实现代码

package com.spring.circlview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

public class GpsSigntView extends View {

	public GpsSigntView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		init();
	}
	public GpsSigntView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}
	public GpsSigntView(Context context) {
		super(context);
		init();
	}
	private void init(){
		mPaint = new Paint();
		//画笔平滑,不然边缘不堪入目
		mPaint.setAntiAlias(true);
		mPaint.setColor(Color.WHITE);
		//设置画笔不填充
		mPaint.setStyle(Style.STROKE);
		//描边的大小
		mPaint.setStrokeWidth(strokeWidth);
//		mPaint.setAlpha(0x88);
		//三个绘制的矩形范围
		rectF = new RectF(strokeWidth, strokeWidth, width-strokeWidth, height-strokeWidth);
		yellow = new RectF(strokeWidth*2,height*2/5, width-strokeWidth*2, height-strokeWidth*2);
		green = new RectF(strokeWidth*2,strokeWidth*2, width-strokeWidth*2, height-strokeWidth*2);
		//new TwinkleTask().execute(0);
	}
	
	private Paint mPaint ;
	private RectF rectF ;
	private RectF yellow ;
	private RectF green;
	private int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
	private int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());
	private float radus = width/2;
	private float strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());

	private int level1_color = Color.RED;
	
	private int level2_color = Color.YELLOW;
	
	private int level3_color = Color.GREEN;
	
	private int status = 1;
	
        private boolean run = true;
	
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}
	int Interval = 500;
	
         //View附加的时候调用
	@Override
	protected void onAttachedToWindow() {
		super.onAttachedToWindow();
		new TwinkleTask().execute(0);
	}
         //View脱离附加的时候调用
	@Override
	protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		run = false;
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		//重置View的大小
		setMeasuredDimension(width, height);
	}
	
	//心跳线程,用来定时更新状态
	class TwinkleTask extends AsyncTask<Integer, Integer, Integer>{
		@Override
		protected Integer doInBackground(Integer... params) {
			while (run) {
				try {
					Thread.sleep(Interval);
					//不是一级下面不更新
					if(status<=1)
						publishProgress(0);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
                     return 0;
		}
		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			//更新跳动状态,然View在0级和一级之间切换
			status = (status+1)%2;
			invalidate();
		}
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		//黑背景不一定是必须的
		canvas.drawColor(Color.BLACK);
		mPaint.setColor(Color.WHITE);
		mPaint.setStyle(Style.STROKE);
		//最外层的白色圆角方形
		canvas.drawRoundRect(rectF, radus, radus, mPaint);
		//状态绘制
		switch (status) {
		case 0:
		{
		}
		break;
		case 1:
		{
			mPaint.setColor(level1_color);
			//设置画笔填充
			mPaint.setStyle(Style.FILL);
			//画一个红色小圆
			canvas.drawCircle(this.width/2, height-this.width/2, radus-strokeWidth*2, mPaint);
		}
		break;
		case 2:
		{
			mPaint.setColor(level2_color);
			//设置画笔填充
			mPaint.setStyle(Style.FILL);
			//绘制黄色的方形
			canvas.drawRoundRect(yellow, radus, radus, mPaint);
		}
		break;
		case 3:
		{
			mPaint.setColor(level3_color);
			//设置画笔填充
			mPaint.setStyle(Style.FILL);
			//填充绿色框
			canvas.drawRoundRect(green, radus, radus, mPaint);
		}
		break;
		}
	}
	
}

VIew的核心代码就是上面,很简短。看看大家应该读能懂了

layout代码:

<?

xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.spring.circlview.GpsSigntView android:id="@+id/level1" android:layout_width="20dp" android:layout_centerInParent="true" android:layout_height="100dp" /> <com.spring.circlview.GpsSigntView android:id="@+id/level2" android:layout_toRightOf="@+id/level1" android:layout_centerInParent="true" android:layout_width="20dp" android:layout_height="100dp" /> <com.spring.circlview.GpsSigntView android:id="@+id/level3" android:layout_width="20dp" android:layout_toRightOf="@+id/level2" android:layout_centerInParent="true" android:layout_height="100dp" /> </RelativeLayout>

Main文件调用代码

GpsSigntView level2 = (GpsSigntView) this.findViewById(R.id.level2);
		level2.setStatus(2);
		GpsSigntView level3 = (GpsSigntView) this.findViewById(R.id.level3);
		level3.setStatus(3);

项目文件就不用上传了吧。直接贴View的代码到项目种就能够用了。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117201.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • binlog日志记录什么内容_mysqlbinlog日志在哪

    binlog日志记录什么内容_mysqlbinlog日志在哪(一)binlog介绍binlog,即二进制日志,它记录了数据库上的所有改变,并以二进制的形式保存在磁盘中;它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制(主从数据库的复制)。(二)binlog格式binlog有三种格式:Statement、Row以及Mixed。–基于SQL语句的复制(statement-basedreplic

    2022年10月14日
    0
  • MySQL – SQL语句增加字段/修改字段/修改类型/修改默认值[通俗易懂]

    MySQL – SQL语句增加字段/修改字段/修改类型/修改默认值[通俗易懂]1.应用场景 有时[比如在Linux服务器下,或者借助数据库管理工具执行SQL],需要使用sql语句直接对数据表进行新建/修改表结构,填充/更新数据等. 好处:可以避免繁琐操作,遗漏,快捷方便,一步到位. 2.学习/操作 20190903新补充 1.添加字段,比如我在数据表中添加一个age字段,类型为int(11…

    2022年4月30日
    541
  • php中常见的大坑,开发中应尽量避免

    php中常见的大坑,开发中应尽量避免

    2022年2月20日
    43
  • intellij idea 2022.01激活码【2022.01最新】

    (intellij idea 2022.01激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月1日
    192
  • acwing-1169. 糖果(差分约束)「建议收藏」

    acwing-1169. 糖果(差分约束)「建议收藏」幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, 老师需要满足小朋友们的 K 个要求。幼儿园的糖果总是有限的,老师想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。输入格式输入的第一行是两个整数 N,K。接下来 K 行,表示分配糖果时需要满足的关系,每行 3 个数字 X,A,B。如果 X=1.表示第 A 个小

    2022年8月11日
    0
  • 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)「建议收藏」

    扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)「建议收藏」扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)文章目录扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)理论讲解KF和EKF模型对比雅可比矩阵计算计算实例应用实例线性模型CV模型:CA模型非线性模型CTRV模型:CTRV实例(python)smalldemo抛物线demo飞机高度demoC++实例参考文献我们上篇提到的卡尔曼滤波是用于线性系统,预测(运动)模型和观测模型是在假设高斯和线性情况下进行的。简单的卡尔曼滤波必须应用在符合高斯分布

    2022年6月16日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号