服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android中自定义控件之液位指示器

Android中自定义控件之液位指示器

2021-06-28 15:59bluejww Android

这篇文章主要介绍了Android中自定义控件之液位指示器 方法的相关资料,需要的朋友可以参考下

由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,只是做一个控件,液位指示,其实就是继承自progressbar,然后重新写一测量与绘制,算是对自定义控件进行一下复习。

  我们要做的最终就是下面这个效果:

在这里,我们要做到对这个指示器的以下属性可设置:

容器壁的厚度、容器壁的颜色、容器中液体的宽度、液体总高度、液体当前高度的颜色显示、液体未达到颜色显示、当前高度的文字指示、指示文字大小的显示。

对以上属性的可以设置,会使在实现应用中让显示更加直观人性化。下面就开始我们的指示器的制作。

Android中自定义控件之液位指示器

1.先在项目的res目录下建一个resouce文件,用来定义自定义的属性,这些都会在下面给出的源码中给出,新人可以参考下,老家伙你就绕道吧^^:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="." encoding="utf-"?>
<resources>
<declare-styleable name="jianwwindicateprogress">
<attr name="progress_height" format="dimension" />
<attr name="progress_width" format="dimension" />
<attr name="progress_unreachedcolor" format="color" />
<attr name="progress_reached_color" format="color" />
<attr name="progress_reached_height" format="integer" />
<attr name="progress_cheek_width" format="dimension" />
<attr name="progress_cheek_color" format="color" />
<attr name="progress_reached_textsize" format="dimension" />
<attr name="progress_reached_textcolor" format="color" />
</declare-styleable>
</resources>

2.继承progressbar,这里继承他主要是为了能够用progressbar的getprogress()方法得到当前的progress,与setprogress()方法等progress中提供的一些方法,便于对数据的一些处理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package com.jianww.firstview;
import com.example.jwwcallback.r;
import android.content.context;
import android.content.res.typedarray;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.paint;
import android.graphics.paint.style;
import android.graphics.rect;
import android.util.attributeset;
import android.util.typedvalue;
import android.widget.progressbar;
public class jianwwindicateprogress extends progressbar {
private static final int unreached_color = xaaff;// 未到达的颜色
private static final int reached_color = xaaff;// 到达颜色
private static final int progress_height = ;// 容器中液位的默认高度
private static final int progress_width = ;// 容器中液位的宽度
private static final int reached_height = ;// 默认到达到达的高度
private static final int progress_cheek_width = ;// 容器的边框宽度
private static final int progress_cheek_color = xff;// 容器的边框颜色
private static final int progress_reached_textsize = ;// 指示字体尺寸
private static final int progress_reached_textcolor = xffff;// 指示字体颜色
protected int unreachedcolor;// 未到达的颜色
protected int reachedcolor;// 到达颜色
protected int progressheight;// 容器中液位的总高度
protected int progresswidth;// 容器中液面的宽度
protected int reachedheight;// 默认液位到达的到达的高度
protected int cheekwidth;// 容器的边框宽度
protected int cheekcolor;// 容器的边框颜色
protected int reachedtextsize;// 指示字体尺寸
protected int reachedtextcolor;// 指示字体颜色
protected float widthzoom;
protected float heightzoom;
/**
* dp px
*
*/
protected int dppx(int dpval) {
return (int) typedvalue.applydimension(typedvalue.complex_unit_dip, dpval, getresources().getdisplaymetrics());
}
/**
* sp px
*
*/
protected int sppx(int spval) {
return (int) typedvalue.applydimension(typedvalue.complex_unit_sp, spval, getresources().getdisplaymetrics());
}
private paint paintcheek = new paint();
private paint paint = new paint();
private float radio;
private float progressnowheight;
public jianwwindicateprogress(context context) {
this(context, null);
}
public jianwwindicateprogress(context context, attributeset asets) {
this(context, asets, );
}
public jianwwindicateprogress(context context, attributeset asets, int defstyle) {
super(context, asets, defstyle);
obtainstyledattributes(asets);
// paint.settextsize(reachedtextsize);
// paint.setcolor(reachedtextcolor);
}
/**
* 定义属性
*
* @param asets属性
*/
private void obtainstyledattributes(attributeset asets) {
final typedarray typearray = getcontext().obtainstyledattributes(asets, r.styleable.jianwwindicateprogress);
unreachedcolor = typearray.getcolor(r.styleable.jianwwindicateprogress_progress_unreachedcolor,
unreached_color);
reachedcolor = typearray.getcolor(r.styleable.jianwwindicateprogress_progress_reached_color, reached_color);// 到达颜色
progressheight = (int) typearray.getdimension(r.styleable.jianwwindicateprogress_progress_height,
progress_height);
progresswidth = dppx(
(int) typearray.getdimension(r.styleable.jianwwindicateprogress_progress_width, progress_width));// 容器的总宽度
reachedheight = (int) typearray.getdimension(r.styleable.jianwwindicateprogress_progress_reached_height,
reached_height);// 到达的高度
cheekwidth = (int) typearray.getdimension(r.styleable.jianwwindicateprogress_progress_cheek_width,
progress_cheek_width);// 容器的边框宽度
cheekcolor = typearray.getcolor(r.styleable.jianwwindicateprogress_progress_cheek_color, progress_cheek_color);
reachedtextsize = (int) typearray.getdimension(r.styleable.jianwwindicateprogress_progress_reached_textsize,
progress_reached_textsize);// 指示字体尺寸
reachedtextcolor = typearray.getcolor(r.styleable.jianwwindicateprogress_progress_reached_textcolor,
progress_reached_textcolor);// 指示字体颜色
typearray.recycle();
}
/**
* onmeasure是对绘出的控件将来占的空间进行的安排,
*/
@override
protected synchronized void onmeasure(int widthmeasurespec, int heightmeasurespec) {
super.onmeasure(widthmeasurespec, heightmeasurespec);
int totalwidth = measurdwidth(widthmeasurespec);
int totalheight = measurdheight(heightmeasurespec);
setmeasureddimension(totalwidth, totalheight);
}
/**
*
* @param widthmeasurespec
* @return 获取宽度尺寸
*/
private int measurdwidth(int widthmeasurespec) {
int result = ;
int widthspacesize = measurespec.getsize(widthmeasurespec);
int widthspacemode = measurespec.getmode(widthmeasurespec);
if (widthspacemode == measurespec.exactly) {
result = widthspacesize;
widthzoom = widthspacesize/(progresswidth+*cheekwidth);
progresswidth = (int) (progresswidth * widthzoom);
} else if (widthspacemode == measurespec.unspecified) {
result = math.max(widthspacesize, getpaddingleft() + getpaddingright() + progresswidth + * cheekwidth);
} else if (widthspacemode == measurespec.at_most) {
result = math.min(widthspacesize, getpaddingleft() + getpaddingright() + progresswidth + * cheekwidth);
}
return result;
}
/**
*
* @param heightmeasurespec
* @return获取高度尺寸
*/
private int measurdheight(int heightmeasurespec) {
int result = ;
int heightspacesize = measurespec.getsize(heightmeasurespec);
int heightspacemode = measurespec.getmode(heightmeasurespec);
if (heightspacemode == measurespec.exactly) {
result = heightspacesize;
heightzoom = heightspacesize/(progressheight+*cheekwidth);
progressheight = (int) (progressheight*heightzoom);
} else if (heightspacemode == measurespec.unspecified) {
result = math.max(heightspacesize, getpaddingtop() + getpaddingbottom() + progressheight + * cheekwidth);
} else if (heightspacemode == measurespec.at_most) {
result = math.min(heightspacesize, getpaddingtop() + getpaddingbottom() + progressheight + * cheekwidth);
}
return result;
}
/**
* 绘制控件
*/
@override
protected synchronized void ondraw(canvas canvas) {
super.ondraw(canvas);
radio = getprogress() * .f / getmax();
progressnowheight = (int) (progressheight * radio);
// 存绘画前画布状态
canvas.save();
// 把画布移动到要绘制的点
canvas.translate(getpaddingleft(), getpaddingright());
// 绘制容器外壳
paintcheek.setcolor(cheekcolor);// 画笔颜色
paintcheek.setantialias(true);// 是否过度
paintcheek.setstyle(style.stroke);// 空心
paintcheek.setstrokewidth(cheekwidth);// 边框的宽度
canvas.drawrect(cheekwidth/, cheekwidth/, progresswidth + cheekwidth*/, progressheight + cheekwidth*/,
paintcheek);
// 绘总液位
paint.setcolor(unreachedcolor);
paint.setstyle(style.fill);
canvas.drawrect(cheekwidth, cheekwidth, progresswidth+cheekwidth, progressheight+cheekwidth,
paint);
// 绘当前液位
paint.setstyle(style.fill);
paint.setcolor(reachedcolor);
canvas.drawrect(cheekwidth, cheekwidth + progressheight - progressnowheight,
progresswidth + cheekwidth, progressheight + cheekwidth, paint);
// 绘液位指示
string text = getprogress() + "%";
paint.settextsize(reachedtextsize);
paint.setcolor(reachedtextcolor);
float textheight = sppx(reachedtextsize)/;
if(progressnowheight >= progressheight/){
canvas.drawtext(text, cheekwidth + progresswidth / , cheekwidth + progressheight - progressnowheight+textheight, paint);
}else{
canvas.drawtext(text, cheekwidth + progresswidth / , cheekwidth + progressheight - progressnowheight, paint);
}
canvas.restore();
}
}

3.就是在布局中的引用了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:jwwprogress="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res/com.example.jwwcallback"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<com.jianww.firstview.jianwwindicateprogress
android:id="@+id/jp_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerinparent="true"
android:max=""
app:progress_cheek_color="#ff"
app:progress_cheek_width="dp"
app:progress_height="dp"
app:progress_reached_color="#ff"
app:progress_reached_textcolor="#"
app:progress_reached_textsize="sp"
app:progress_unreachedcolor="#ff"
app:progress_width="dp" />
</relativelayout>

4.就是在acitivity中的初始化与使用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.example.jwwmain;
import java.io.ioexception;
import java.net.httpurlconnection;
import java.net.malformedurlexception;
import java.net.url;
import java.util.random;
import com.example.jwwcallback.r;
import com.jianww.firstview.jianwwindicateprogress;
import android.app.activity;
import android.os.bundle;
import android.os.handler;
public class mainactivity extends activity {
private jianwwindicateprogress jprogress;
private int nowprogress;
private handler mhandler = new handler() {
public void handlemessage(android.os.message msg) {
int progress = jprogress.getprogress();
jprogress.setprogress(++progress);
if (progress >= ) {
jprogress.setprogress();
}
mhandler.sendemptymessagedelayed(, );
};
};
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
initview();
}
private void initview() {
jprogress = (jianwwindicateprogress) findviewbyid(r.id.jp_progress);
mhandler.sendemptymessage();
}
}

关于android中自定义控件之液位指示器的相关知识就给大家介绍到这里,希望对大家有所帮助!

延伸 · 阅读

精彩推荐
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03