如何实现数字lcd显示效果(原创)

如题,我最先想到的是找一种字体,然后来显示lcd的效果,但是字体又无法满足有空位的时候那个暗灰色的文字的效果,如下所示

就是前三位那些灰色的888,因为你设置数值的时候只能是从0-9的数字,而这灰色的8你无法给他们设置,也没有这种文字,所以,

字体的方案被废弃了。于是我想到了google play上有好多hud的项目,他们说不定有人用这种方式显示,然后就找到了几个apk对

他们进行了反编译,结果发现他们内部都是从0-9的图片文件。然后通过自定义view实现了这种效果。

因此我就把它们的图片复制下来,放到自己的项目中。实现这个自定义view呢。首先我们需要一个布局文件,在一个线性布局中放入了6个imageview。

如下

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:background="@android:color/black"
 6     android:orientation="horizontal" >
 7 
 8     <ImageView
 9         android:id="@+id/imageView6"
10         android:layout_width="match_parent"
11         android:layout_height="match_parent"
12         android:layout_weight="1"
13         android:scaleType="fitXY"
14         android:src="@drawable/eight217x324" />
15 
16     <ImageView
17         android:id="@+id/imageView5"
18         android:layout_width="match_parent"
19         android:layout_height="match_parent"
20         android:layout_weight="1"
21         android:scaleType="fitXY"
22         android:src="@drawable/eight217x324" />
23 
24     <ImageView
25         android:id="@+id/imageView4"
26         android:layout_width="match_parent"
27         android:layout_height="match_parent"
28         android:layout_weight="1"
29         android:scaleType="fitXY"
30         android:src="@drawable/eight217x324" />
31 
32     <ImageView
33         android:id="@+id/imageView3"
34         android:layout_width="match_parent"
35         android:layout_height="match_parent"
36         android:layout_weight="1"
37         android:scaleType="fitXY"
38         android:src="@drawable/eight217x324" />
39 
40     <ImageView
41         android:id="@+id/imageView2"
42         android:layout_width="match_parent"
43         android:layout_height="match_parent"
44         android:layout_weight="1"
45         android:scaleType="fitXY"
46         android:src="@drawable/eight217x324" />
47 
48     <ImageView
49         android:id="@+id/imageView1"
50         android:layout_width="match_parent"
51         android:layout_height="match_parent"
52         android:layout_weight="1"
53         android:scaleType="fitXY"
54         android:src="@drawable/eight217x324" />
55 
56 </LinearLayout>

把它们的布局属性定义为填充父布局,然后横向的权重都为1.等比拉伸。

接下来写view

  1 package com.example.customview01.view;
  2 
  3 import com.example.customview01.R;
  4 
  5 import android.content.Context;
  6 import android.content.res.ColorStateList;
  7 import android.content.res.TypedArray;
  8 import android.graphics.Color;
  9 import android.graphics.drawable.Drawable;
 10 import android.support.v4.graphics.drawable.DrawableCompat;
 11 import android.util.AttributeSet;
 12 import android.view.View;
 13 import android.widget.ImageView;
 14 import android.widget.LinearLayout;
 15 
 16 public class DigitalView extends LinearLayout {
 17     private ImageView imageView1, imageView2, imageView3, imageView4,
 18             imageView5, imageView6;
 19     private int[] images = { R.drawable.zero217x324, R.drawable.one217x324,
 20             R.drawable.two217x324, R.drawable.three217x324,
 21             R.drawable.four217x324, R.drawable.five217x324,
 22             R.drawable.six217x324, R.drawable.seven217x324,
 23             R.drawable.eight217x324, R.drawable.nine217x324,
 24             R.drawable.blank217x324 };
 25     private int six, five, four, three, two, one, numbers;
 26     private Drawable icon0, icon1, icon2, icon3, icon4, icon5, icon6, icon7,
 27             icon8, icon9, icon10;
 28 
 29     public DigitalView(Context context, AttributeSet attrs) {
 30         this(context, attrs, 0);
 31     }
 32 
 33     public DigitalView(Context context) {
 34         this(context, null);
 35     }
 36 
 37     public DigitalView(Context context, AttributeSet attrs, int defStyleAttr) {
 38         super(context, attrs, defStyleAttr);
 39         TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
 40                 R.styleable.digitalView, defStyleAttr, 0);
 41         int n = a.getIndexCount();
 42         for (int i = 0; i < n; i++) {
 43             int attr = a.getIndex(i);
 44             switch (attr) {
 45             case R.styleable.digitalView_textNumbers:
 46                 numbers = a.getInt(attr, 1);
 47                 break;
 48 
 49             default:
 50                 break;
 51             }
 52         }
 53         initView(context);
 54     }
 55 
 56     public void initView(Context context) {
 57         View view = View.inflate(getContext(), R.layout.digitalview, null);
 58         view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
 59                 LayoutParams.MATCH_PARENT));
 60         addView(view);
 61         imageView1 = (ImageView) findViewById(R.id.imageView1);
 62         imageView2 = (ImageView) findViewById(R.id.imageView2);
 63         imageView3 = (ImageView) findViewById(R.id.imageView3);
 64         imageView4 = (ImageView) findViewById(R.id.imageView4);
 65         imageView5 = (ImageView) findViewById(R.id.imageView5);
 66         imageView6 = (ImageView) findViewById(R.id.imageView6);
 67         icon0 = context.getResources().getDrawable(images[0]);
 68         icon1 = context.getResources().getDrawable(images[1]);
 69         icon2 = context.getResources().getDrawable(images[2]);
 70         icon3 = context.getResources().getDrawable(images[3]);
 71         icon4 = context.getResources().getDrawable(images[4]);
 72         icon5 = context.getResources().getDrawable(images[5]);
 73         icon6 = context.getResources().getDrawable(images[6]);
 74         icon7 = context.getResources().getDrawable(images[7]);
 75         icon8 = context.getResources().getDrawable(images[8]);
 76         icon9 = context.getResources().getDrawable(images[9]);
 77         icon10 = context.getResources().getDrawable(images[10]);
 78         setNumbers(numbers);
 79     }
 80 
 81     /**
 82      * <br/>
 83      * 概述:着色 <br/>
 84      * 
 85      * @param color
 86      */
 87     public void setColor(int color) {
 88         icon0 = tintDrawable(icon0, ColorStateList.valueOf(color));
 89         icon1 = tintDrawable(icon1, ColorStateList.valueOf(color));
 90         icon2 = tintDrawable(icon2, ColorStateList.valueOf(color));
 91         icon3 = tintDrawable(icon3, ColorStateList.valueOf(color));
 92         icon4 = tintDrawable(icon4, ColorStateList.valueOf(color));
 93         icon5 = tintDrawable(icon5, ColorStateList.valueOf(color));
 94         icon6 = tintDrawable(icon6, ColorStateList.valueOf(color));
 95         icon7 = tintDrawable(icon7, ColorStateList.valueOf(color));
 96         icon8 = tintDrawable(icon8, ColorStateList.valueOf(color));
 97         icon9 = tintDrawable(icon9, ColorStateList.valueOf(color));
 98     }
 99 
100     /**
101      * <br/>
102      * 概述:设置位数 <br/>
103      */
104     public void setNumbers(int numbers) {
105         this.numbers = numbers;
106         switch (numbers) {
107         case 1:
108             imageView1.setVisibility(View.VISIBLE);
109             imageView2.setVisibility(View.GONE);
110             imageView3.setVisibility(View.GONE);
111             imageView4.setVisibility(View.GONE);
112             imageView5.setVisibility(View.GONE);
113             imageView6.setVisibility(View.GONE);
114             break;
115         case 2:
116             imageView1.setVisibility(View.VISIBLE);
117             imageView2.setVisibility(View.VISIBLE);
118             imageView3.setVisibility(View.GONE);
119             imageView4.setVisibility(View.GONE);
120             imageView5.setVisibility(View.GONE);
121             imageView6.setVisibility(View.GONE);
122             break;
123         case 3:
124             imageView1.setVisibility(View.VISIBLE);
125             imageView2.setVisibility(View.VISIBLE);
126             imageView3.setVisibility(View.VISIBLE);
127             imageView4.setVisibility(View.GONE);
128             imageView5.setVisibility(View.GONE);
129             imageView6.setVisibility(View.GONE);
130             break;
131         case 4:
132             imageView1.setVisibility(View.VISIBLE);
133             imageView2.setVisibility(View.VISIBLE);
134             imageView3.setVisibility(View.VISIBLE);
135             imageView4.setVisibility(View.VISIBLE);
136             imageView5.setVisibility(View.GONE);
137             imageView6.setVisibility(View.GONE);
138             break;
139         case 5:
140             imageView1.setVisibility(View.VISIBLE);
141             imageView2.setVisibility(View.VISIBLE);
142             imageView3.setVisibility(View.VISIBLE);
143             imageView4.setVisibility(View.VISIBLE);
144             imageView5.setVisibility(View.VISIBLE);
145             imageView6.setVisibility(View.GONE);
146             break;
147         case 6:
148             imageView1.setVisibility(View.VISIBLE);
149             imageView2.setVisibility(View.VISIBLE);
150             imageView3.setVisibility(View.VISIBLE);
151             imageView4.setVisibility(View.VISIBLE);
152             imageView5.setVisibility(View.VISIBLE);
153             imageView6.setVisibility(View.VISIBLE);
154             break;
155 
156         default:
157             break;
158         }
159     }
160 
161     /**
162      * <br/>
163      * 概述:设置数值 <br/>
164      */
165     public void setValue(int value) {
166         six = value % 1000000 / 100000;
167         five = value % 100000 / 10000;
168         four = value % 10000 / 1000;
169         three = value % 1000 / 100;
170         two = value % 100 / 10;
171         one = value % 10;
172         imageView1.setImageResource(images[one]);
173         imageView2.setImageResource(images[two]);
174         imageView3.setImageResource(images[three]);
175         imageView4.setImageResource(images[four]);
176         imageView5.setImageResource(images[five]);
177         imageView6.setImageResource(images[six]);
178         if (six == 0) {
179             imageView6.setImageResource(images[10]);
180             if (five == 0) {
181                 imageView5.setImageResource(images[10]);
182                 if (four == 0) {
183                     imageView4.setImageResource(images[10]);
184                     if (three == 0) {
185                         imageView3.setImageResource(images[10]);
186                         if (two == 0) {
187                             imageView2.setImageResource(images[10]);
188                         }
189                     }
190                 }
191             }
192         }
193     }
194 
195     /**
196      * <br/>
197      * 概述:给drawable着色 <br/>
198      * 
199      * @param drawable
200      * @param colors
201      * @return
202      */
203     public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) {
204         final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
205         DrawableCompat.setTintList(wrappedDrawable, colors);
206         return wrappedDrawable;
207     }
208 }

自定义的view实现了一些常用方法,例如设置位数,设置数值,设置颜色,有了源码,不用解释这些也很简单。设置颜色是使用了v4包中的着色的函数。目前还有些问题,改变颜色只改变变化了图像的颜色,猜测是设置图片的时候android使用了缓存。这个问题稍后再解决。

另外程序也支持了使用xml设置显示的位数,这个需要在res/values文件夹下加入以下xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3 
 4     <attr name="textNumbers" format="string" />
 5 
 6     <declare-styleable name="digitalView">
 7         <attr name="textNumbers" />
 8     </declare-styleable>
 9 
10 </resources>

然后使用的时候需要注意,在xml中加入

 1 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01" 

该段代码的意思是引入自定义属性

使用示例

1 <com.example.customview01.view.DigitalView
2         android:id="@+id/digitalView"
3         android:layout_width="200dp"
4         android:layout_height="50dp"
5         custom:textNumbers="6" >
6     </com.example.customview01.view.DigitalView>

控制代码如下

 1 package com.example.customview01;
 2 
 3 import com.example.customview01.view.DigitalView;
 4 
 5 import android.os.Bundle;
 6 import android.app.Activity;
 7 import android.graphics.Color;
 8 import android.view.Menu;
 9 import android.view.View;
10 import android.view.View.OnClickListener;
11 
12 public class MainActivity extends Activity implements OnClickListener {
13     private DigitalView digitalView;
14 
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19         digitalView = (DigitalView) findViewById(R.id.digitalView);
20         findViewById(R.id.button1).setOnClickListener(this);
21         findViewById(R.id.button2).setOnClickListener(this);
22         findViewById(R.id.button3).setOnClickListener(this);
23         findViewById(R.id.button4).setOnClickListener(this);
24         findViewById(R.id.button11).setOnClickListener(this);
25         findViewById(R.id.button12).setOnClickListener(this);
26         findViewById(R.id.button13).setOnClickListener(this);
27         findViewById(R.id.button14).setOnClickListener(this);
28         findViewById(R.id.button15).setOnClickListener(this);
29         findViewById(R.id.button16).setOnClickListener(this);
30         new Thread(new Runnable() {
31             int value = 0;
32 
33             @Override
34             public void run() {
35                 while (true) {
36                     value++;
37                     digitalView.post(new Runnable() {
38 
39                         @Override
40                         public void run() {
41                             digitalView.setValue(value);
42                         }
43                     });
44                     try {
45                         Thread.sleep(200);
46                     } catch (InterruptedException e) {
47                         // TODO Auto-generated catch block
48                         e.printStackTrace();
49                     }
50                 }
51 
52             }
53         }).start();
54     }
55 
56     @Override
57     public void onClick(View v) {
58         switch (v.getId()) {
59         case R.id.button1:
60             digitalView.setColor(Color.BLUE);
61             break;
62         case R.id.button2:
63             digitalView.setColor(Color.RED);
64             break;
65         case R.id.button3:
66             digitalView.setColor(Color.WHITE);
67             break;
68         case R.id.button4:
69             digitalView.setColor(Color.YELLOW);
70             break;
71         case R.id.button11:
72             digitalView.setNumbers(1);
73             break;
74         case R.id.button12:
75             digitalView.setNumbers(2);
76             break;
77         case R.id.button13:
78             digitalView.setNumbers(3);
79             break;
80         case R.id.button14:
81             digitalView.setNumbers(4);
82             break;
83         case R.id.button15:
84             digitalView.setNumbers(5);
85             break;
86         case R.id.button16:
87             digitalView.setNumbers(6);
88             break;
89 
90         default:
91             break;
92         }
93     }
94 }

代码已经上传到github,地址:https://github.com/dongweiq/study/tree/master/DigitalView

我的github地址:https://github.com/dongweiq/study

欢迎关注,欢迎star o(∩_∩)o 。有什么问题请邮箱联系 dongweiqmail@gmail.com qq714094450

原文地址:https://www.cnblogs.com/dongweiq/p/4829904.html