1、前言

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

2、实现目标效果图

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

我这个实现的是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的代码到项目种就能够用了。

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

android 电平信号状态识别View平局的更多相关文章

  1. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

  2. Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)

    原文:Android菜鸟的成长笔记(15)-- Android中的状态保存探究(下) 在上一篇中我们简单了解关于Android中状态保存的过程和原理,这一篇中我们来看一下在系统配置改变的情况下保存数据 ...

  3. Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图

    Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图 分类: OpenCV图像处理2013-02-21 21:35 6459人阅读 评论(8) 收藏 举报   原文链接  ht ...

  4. Android自定义控件(状态提示图表) (转)

    源:Android自定义控件(状态提示图表) 源:Android应用开发 [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1  背景 前面分析 ...

  5. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

  6. Android查缺补漏(View篇)--事件分发机制

    事件分发机制是Android中非常重要的一个知识点,同时也是难点,相信到目前为止很多Android开发者对事件分发机制并没有一个非常系统的认识,当然也包括博主个人在内.可能在平时的开发工作中我们并没有 ...

  7. Android查缺补漏(View篇)--事件分发机制源码分析

    在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)-- ...

  8. Android静态图片人脸识别的完整demo(附完整源码)

    Demo功能:利用android自带的人脸识别进行识别,标记出眼睛和人脸位置.点击按键后进行人脸识别,完毕后显示到imageview上. 第一部分:布局文件activity_main.xml < ...

  9. Android二维码识别 开源项目ZXing的编译

    Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...

随机推荐

  1. Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 构造方法 ...

  2. Java重命名文件

    File file = new File("D:\\aa\a.txt");     file.renameTo(new File("D:\\aa\\b.txt" ...

  3. wxWidgets刚開始学习的人导引(1)——前言

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...

  4. 元素z-index继承问题

    两同层元素.当中一个的子元素定位与还有一个重叠时,该子元素被覆盖(此时子元素的z-index继承的是其父元素的z-index,不管其z-index多少均被覆盖) <html> <he ...

  5. Vector Clock理解

    背景近期在重读"Dynamo: Amazon's Highly Available Key-value Store"(经典好文,推荐!).文章4.4 中聊到了Data Versio ...

  6. HDU 4982 Goffi and Squary Partition(推理)

    HDU 4982 Goffi and Squary Partition 思路:直接从全然平方数往下找,然后推断是否能构造出该全然平方数,假设能够就是yes,假设都不行就是no.注意构造时候的推断,因为 ...

  7. 为什么android你用的越多,速度较慢的手机

    依据第三方的调研数据显示,有 77% 的 Android 手机用户承认自己曾遭遇过手机变慢的影响,百度搜索"Android+ 卡慢",也有超过 460 万条结果. 在业内.Andr ...

  8. TimesTen更改CacheGroup管理用户ORACLE结束和TT结束password【TimesTen操作和维修基地】

    password管理一直操作的一部分的安全管理和维护.CacheGroup管理用户password虽然并不复杂变化.然而,这是用于生产,改不好比较easy导致失败.简介点击这里CacheGroup管理 ...

  9. WPF中的三维空间(1)

    原文:WPF中的三维空间(1) WPF中可以创建三维几何图形,支持3D对象的应用,支持从3D Max等软件将3D文件obj导入设计中,但是目前还不支持将材质同时导入,这样需要在WPF中对3D对象重新设 ...

  10. 在JBuilder8中使用ANT

    在JBuilder8中使用ANT                                                            作者:翁驰原    在JBuilder8中,Ap ...