如何实现数字lcd显示效果(原创)
如题,我最先想到的是找一种字体,然后来显示lcd的效果,但是字体又无法满足有空位的时候那个暗灰色的文字的效果,如下所示
就是前三位那些灰色的888,因为你设置数值的时候只能是从0-9的数字,而这灰色的8你无法给他们设置,也没有这种文字,所以,
字体的方案被废弃了。于是我想到了google play上有好多hud的项目,他们说不定有人用这种方式显示,然后就找到了几个apk对
他们进行了反编译,结果发现他们内部都是从0-9的图片文件。然后通过自定义view实现了这种效果。
因此我就把它们的图片复制下来,放到自己的项目中。实现这个自定义view呢。首先我们需要一个布局文件,在一个线性布局中放入了6个imageview。
如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:orientation="horizontal" > <ImageView
android:id="@+id/imageView6"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/eight217x324" /> <ImageView
android:id="@+id/imageView5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/eight217x324" /> <ImageView
android:id="@+id/imageView4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/eight217x324" /> <ImageView
android:id="@+id/imageView3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/eight217x324" /> <ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/eight217x324" /> <ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/eight217x324" /> </LinearLayout>
把它们的布局属性定义为填充父布局,然后横向的权重都为1.等比拉伸。
接下来写view
package com.example.customview01.view; import com.example.customview01.R; import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout; public class DigitalView extends LinearLayout {
private ImageView imageView1, imageView2, imageView3, imageView4,
imageView5, imageView6;
private int[] images = { R.drawable.zero217x324, R.drawable.one217x324,
R.drawable.two217x324, R.drawable.three217x324,
R.drawable.four217x324, R.drawable.five217x324,
R.drawable.six217x324, R.drawable.seven217x324,
R.drawable.eight217x324, R.drawable.nine217x324,
R.drawable.blank217x324 };
private int six, five, four, three, two, one, numbers;
private Drawable icon0, icon1, icon2, icon3, icon4, icon5, icon6, icon7,
icon8, icon9, icon10; public DigitalView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public DigitalView(Context context) {
this(context, null);
} public DigitalView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.digitalView, defStyleAttr, 0);
int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.digitalView_textNumbers:
numbers = a.getInt(attr, 1);
break; default:
break;
}
}
initView(context);
} public void initView(Context context) {
View view = View.inflate(getContext(), R.layout.digitalview, null);
view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
addView(view);
imageView1 = (ImageView) findViewById(R.id.imageView1);
imageView2 = (ImageView) findViewById(R.id.imageView2);
imageView3 = (ImageView) findViewById(R.id.imageView3);
imageView4 = (ImageView) findViewById(R.id.imageView4);
imageView5 = (ImageView) findViewById(R.id.imageView5);
imageView6 = (ImageView) findViewById(R.id.imageView6);
icon0 = context.getResources().getDrawable(images[0]);
icon1 = context.getResources().getDrawable(images[1]);
icon2 = context.getResources().getDrawable(images[2]);
icon3 = context.getResources().getDrawable(images[3]);
icon4 = context.getResources().getDrawable(images[4]);
icon5 = context.getResources().getDrawable(images[5]);
icon6 = context.getResources().getDrawable(images[6]);
icon7 = context.getResources().getDrawable(images[7]);
icon8 = context.getResources().getDrawable(images[8]);
icon9 = context.getResources().getDrawable(images[9]);
icon10 = context.getResources().getDrawable(images[10]);
setNumbers(numbers);
} /**
* <br/>
* 概述:着色 <br/>
*
* @param color
*/
public void setColor(int color) {
icon0 = tintDrawable(icon0, ColorStateList.valueOf(color));
icon1 = tintDrawable(icon1, ColorStateList.valueOf(color));
icon2 = tintDrawable(icon2, ColorStateList.valueOf(color));
icon3 = tintDrawable(icon3, ColorStateList.valueOf(color));
icon4 = tintDrawable(icon4, ColorStateList.valueOf(color));
icon5 = tintDrawable(icon5, ColorStateList.valueOf(color));
icon6 = tintDrawable(icon6, ColorStateList.valueOf(color));
icon7 = tintDrawable(icon7, ColorStateList.valueOf(color));
icon8 = tintDrawable(icon8, ColorStateList.valueOf(color));
icon9 = tintDrawable(icon9, ColorStateList.valueOf(color));
} /**
* <br/>
* 概述:设置位数 <br/>
*/
public void setNumbers(int numbers) {
this.numbers = numbers;
switch (numbers) {
case 1:
imageView1.setVisibility(View.VISIBLE);
imageView2.setVisibility(View.GONE);
imageView3.setVisibility(View.GONE);
imageView4.setVisibility(View.GONE);
imageView5.setVisibility(View.GONE);
imageView6.setVisibility(View.GONE);
break;
case 2:
imageView1.setVisibility(View.VISIBLE);
imageView2.setVisibility(View.VISIBLE);
imageView3.setVisibility(View.GONE);
imageView4.setVisibility(View.GONE);
imageView5.setVisibility(View.GONE);
imageView6.setVisibility(View.GONE);
break;
case 3:
imageView1.setVisibility(View.VISIBLE);
imageView2.setVisibility(View.VISIBLE);
imageView3.setVisibility(View.VISIBLE);
imageView4.setVisibility(View.GONE);
imageView5.setVisibility(View.GONE);
imageView6.setVisibility(View.GONE);
break;
case 4:
imageView1.setVisibility(View.VISIBLE);
imageView2.setVisibility(View.VISIBLE);
imageView3.setVisibility(View.VISIBLE);
imageView4.setVisibility(View.VISIBLE);
imageView5.setVisibility(View.GONE);
imageView6.setVisibility(View.GONE);
break;
case 5:
imageView1.setVisibility(View.VISIBLE);
imageView2.setVisibility(View.VISIBLE);
imageView3.setVisibility(View.VISIBLE);
imageView4.setVisibility(View.VISIBLE);
imageView5.setVisibility(View.VISIBLE);
imageView6.setVisibility(View.GONE);
break;
case 6:
imageView1.setVisibility(View.VISIBLE);
imageView2.setVisibility(View.VISIBLE);
imageView3.setVisibility(View.VISIBLE);
imageView4.setVisibility(View.VISIBLE);
imageView5.setVisibility(View.VISIBLE);
imageView6.setVisibility(View.VISIBLE);
break; default:
break;
}
} /**
* <br/>
* 概述:设置数值 <br/>
*/
public void setValue(int value) {
six = value % 1000000 / 100000;
five = value % 100000 / 10000;
four = value % 10000 / 1000;
three = value % 1000 / 100;
two = value % 100 / 10;
one = value % 10;
imageView1.setImageResource(images[one]);
imageView2.setImageResource(images[two]);
imageView3.setImageResource(images[three]);
imageView4.setImageResource(images[four]);
imageView5.setImageResource(images[five]);
imageView6.setImageResource(images[six]);
if (six == 0) {
imageView6.setImageResource(images[10]);
if (five == 0) {
imageView5.setImageResource(images[10]);
if (four == 0) {
imageView4.setImageResource(images[10]);
if (three == 0) {
imageView3.setImageResource(images[10]);
if (two == 0) {
imageView2.setImageResource(images[10]);
}
}
}
}
}
} /**
* <br/>
* 概述:给drawable着色 <br/>
*
* @param drawable
* @param colors
* @return
*/
public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) {
final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(wrappedDrawable, colors);
return wrappedDrawable;
}
}
自定义的view实现了一些常用方法,例如设置位数,设置数值,设置颜色,有了源码,不用解释这些也很简单。设置颜色是使用了v4包中的着色的函数。目前还有些问题,改变颜色只改变变化了图像的颜色,猜测是设置图片的时候android使用了缓存。这个问题稍后再解决。
另外程序也支持了使用xml设置显示的位数,这个需要在res/values文件夹下加入以下xml
<?xml version="1.0" encoding="utf-8"?>
<resources> <attr name="textNumbers" format="string" /> <declare-styleable name="digitalView">
<attr name="textNumbers" />
</declare-styleable> </resources>
然后使用的时候需要注意,在xml中加入
xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"
该段代码的意思是引入自定义属性
使用示例
<com.example.customview01.view.DigitalView
android:id="@+id/digitalView"
android:layout_width="200dp"
android:layout_height="50dp"
custom:textNumbers="6" >
</com.example.customview01.view.DigitalView>
控制代码如下
package com.example.customview01; import com.example.customview01.view.DigitalView; import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener; public class MainActivity extends Activity implements OnClickListener {
private DigitalView digitalView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
digitalView = (DigitalView) findViewById(R.id.digitalView);
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.button3).setOnClickListener(this);
findViewById(R.id.button4).setOnClickListener(this);
findViewById(R.id.button11).setOnClickListener(this);
findViewById(R.id.button12).setOnClickListener(this);
findViewById(R.id.button13).setOnClickListener(this);
findViewById(R.id.button14).setOnClickListener(this);
findViewById(R.id.button15).setOnClickListener(this);
findViewById(R.id.button16).setOnClickListener(this);
new Thread(new Runnable() {
int value = 0; @Override
public void run() {
while (true) {
value++;
digitalView.post(new Runnable() { @Override
public void run() {
digitalView.setValue(value);
}
});
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}).start();
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
digitalView.setColor(Color.BLUE);
break;
case R.id.button2:
digitalView.setColor(Color.RED);
break;
case R.id.button3:
digitalView.setColor(Color.WHITE);
break;
case R.id.button4:
digitalView.setColor(Color.YELLOW);
break;
case R.id.button11:
digitalView.setNumbers(1);
break;
case R.id.button12:
digitalView.setNumbers(2);
break;
case R.id.button13:
digitalView.setNumbers(3);
break;
case R.id.button14:
digitalView.setNumbers(4);
break;
case R.id.button15:
digitalView.setNumbers(5);
break;
case R.id.button16:
digitalView.setNumbers(6);
break; default:
break;
}
}
}
代码已经上传到github,地址:https://github.com/dongweiq/study/tree/master/DigitalView
我的github地址:https://github.com/dongweiq/study
欢迎关注,欢迎star o(∩_∩)o 。有什么问题请邮箱联系 dongweiqmail@gmail.com qq714094450
如何实现数字lcd显示效果(原创)的更多相关文章
- js完美转换阿拉伯数字为数字大写(原创)
啥都不说,直接上代码: //阿拉伯数字转换为简写汉字 function Arabia_To_SimplifiedChinese(Num) { for (i = Num.length - 1; i &g ...
- 程序点滴001_Python模拟点阵数字
尝试过很多编程语言,写过不少程序(当然,基本上都是些自娱自乐或给自己用的工具类的小玩意儿),逐渐认识到编写程序是一个不断完善.不断优化的过程——编程首先要有一个想法(目标),围绕这个目标形成最基本的功 ...
- CSS魔法堂:再次认识font
一.前言 文字承载着站点内涵,而良好的字体.排版则为用户提供舒适的阅读体验.本文打算对字体稍微深入一下子网页字体的内容,若有纰漏请大家指正,谢谢! 目录一坨: 二, 字体分类 1. 衬线体(Serif ...
- Tabbar视图切换,返回上一视图,添加item
前面有一篇博文iOS学习之Tab Bar的使用和视图切换 这是在AppDelegate里使用Tabbar,这样的程序打开就是TabbarView了,有时候我们需要给程序做一些帮助页面,或者登录页面,之 ...
- Github readme语法-- markdown
README 该文件用来测试和展示书写README的各种markdown语法.GitHub的markdown语法在标准的markdown语法基础上做了扩充,称之为GitHub Flavored Mar ...
- [置顶] 宏途_LCD调试流程.
今天在调试宏途的LCD屏时,开始是开机屏幕不亮,背光都不亮,可能板子已经损坏,一般通过测试电流电压简单验证,(注:硬件引脚没焊好也会引起读lcd id出现错误!!!)出现这个问题一般是因为引脚没焊好, ...
- DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析
针对DAVINCI DM6446平台,网络上也有很多网友写了V4L2的驱动,但只是解析Montavista linux-2.6.10 V4L2的原理.结构和函数,深度不够.本文决定把Montavis ...
- Python-PyQt4学习笔记
1.每个应用必须创建一个 QtGui.QApplication(sys.argv), 此时 QtGui.qApp 为此应用的实例 app = QtGui.QApplication(sys.argv) ...
- 汕头市队赛 C SRM 05 - YYL 杯 R1 T3!
C SRM 05 - YYL 杯 R1 背景 tjmak 描述 给一个大小为n的序列V.序列里的元素有正有负.问至少要删除多少个元素使得序列里不存在区间(要求非空)和 >= S.如果答案大于m, ...
随机推荐
- Listbox与dataGridView的获取鼠标点击事件的区别!!!
lisxian.SelectedIndex = index; Listbox获取鼠标的代码!!!! DataGridViewRow currenRow = this.dgvxian3.Rows[ind ...
- ThinkPHP 的CURD 基本操作
说起CURD,懂点SQL的人都知道,就是增删改查,做业务系统的时候,往往离不开这CURD,最近也是刚刚接触ThinkPHP,ThinkPHP的灵活性是比原生PHP好用的多,下面我就简单的介绍一下我的学 ...
- Java中异常的基本应用(一)
在Java中,我们把异常当做一种对象来处理,正是异常机制的引入,使得我们的程序更加健壮.异常指示了一个不正常的条件,或者一个错误条件,简单地说就是一个中断了正常的指令流的事件.程序控制将无条件的抛至一 ...
- android异常之emulator-arm.exe已停止工作
我遇到的这个问题通过降低了AVD的分辨率后解决了,估计是电脑的显卡不行.
- 2015 偶数求和 AC 杭电
偶数求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- INKDIE
ink die是指分割出来的芯片未能达到原装芯片要求的那些U盘芯片,也就是俗称的黑片. 一整块圆硅分割制成芯片之后需要对其质量进行筛选,根据筛选的要求不同分为三个等级:原装的(Original).白片 ...
- 多备份CEO胡茂华:创业路上的五道坎
本文由多备份CEO胡茂华记述,授权南七道发表,未做删改.胡茂华:腾讯第116号员工,历任腾讯总监.盛大CTO (旅游).1号店技术副总裁.现担任云服务提供商多备份联合创始人&CEO. 2014 ...
- 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序
原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...
- -_-#【Better JS Code】插入迭代值
+function() { var i = 0 var values = ['xiaoming', 'xiaohong'] var name = values[i] i++ console.log(n ...
- (转载)python多行注释
(转载)http://www.cnblogs.com/pylemon/archive/2011/05/23/2054090.html python本身不带多行注释,编辑时每行敲一个“#”相当的不方便, ...