Android中自定义控件之液位指示器
程序员文章站
2024-02-25 20:00:21
由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,...
由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,只是做一个控件,液位指示,其实就是继承自progressbar,然后重新写一测量与绘制,算是对自定义控件进行一下复习。
我们要做的最终就是下面这个效果:
在这里,我们要做到对这个指示器的以下属性可设置:
容器壁的厚度、容器壁的颜色、容器中液体的宽度、液体总高度、液体当前高度的颜色显示、液体未达到颜色显示、当前高度的文字指示、指示文字大小的显示。
对以上属性的可以设置,会使在实现应用中让显示更加直观人性化。下面就开始我们的指示器的制作。
1.先在项目的res目录下建一个resouce文件,用来定义自定义的属性,这些都会在下面给出的源码中给出,新人可以参考下,老家伙你就绕道吧^^:
<?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中提供的一些方法,便于对数据的一些处理。
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.就是在布局中的引用了
<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中的初始化与使用。
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中自定义控件之液位指示器的相关知识就给大家介绍到这里,希望对大家有所帮助!
上一篇: c#3.0实现延迟赋值示例
下一篇: JSP模板应用指南(下)
推荐阅读