如何实现数字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, ...
随机推荐
- UIScrollView设置了contentSize后还是没办法滚动?
1.最常见的原因是 contentSize 这个属性,比uiscrollview的frame要小, 无需滚动, 自然就滚动不了. scrollenabled 这个属性,标识着是否允许滚动,要言设成ye ...
- js 实现win7任务栏拖动效果
前言 在某个时刻, 我认识了一个朋友. 此人在我的教唆下, 踏上了js的不归路. 前天他问我, Win7任务栏拖动效果怎么实现. 我随口就跟他说, 这简单的一逼. 在我一晚上的折腾之后, 一份潦草的代 ...
- Reverse Interger
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have you ...
- 外边距叠加collapsing-margin
原载:Smallni | http://www.smallni.com/collapsing-margin/ 恩,margin叠加一直是个问题,也是我们一直会遇到的问题,很久以前就想把这个知识点整理下 ...
- How to check a not defined variable in javascript
javascript里怎么检查一个未定义的变量? in JavaScript null is an object. There's another value for things that don' ...
- phalcon的一些中文手册和帮助文档地址收集
1:中文官方网站:http://phalconphp.com/zh/ 挺好可以好好看文档 可安装http://bullsoft.org/phalcon-docs/这个去查找,这是个部分中文的手册! P ...
- PHP获取当前文件路径信息的方法
文件名 test.php 1.__FILE__ 获取 “路径 + 文件名” : /var/www/test/test.php echo __FILE__; //取得当前文件的路径:用魔术常量 __ ...
- centos 安装 mongo3.0
官方网站传贴,每次去翻doc,麻烦 vi /etc/yum.repos.d/mongodb-org-3.0.repo [mongodb-org-3.0]name=MongoDB Repository ...
- C51 库函数(3)
3.3 STRING.H:串函数 串函数通常将指针串作输入值.一个串就包括2个或多个字符.串结以空字符表示.在函数memcmp,memcpy,memchr,memccpy,memmove和memset ...
- Qt: 网络编程之UDP(理论+实例)
http://blog.csdn.net/rl529014/article/details/52888525