k1搏击,慈悲修女号上的叛变,中考历史总复习资料
本文将用两个方法来写类似汽车荷载的进度
用linearlayout的addview方法加上for循环
用自定义控件的方法
先上截图
1. 用linearlayout的addview方法加上for循环
1.1 processtest01.xml文件:
<?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:orientation="horizontal" > <linearlayout android:id="@+id/ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> </linearlayout> </linearlayout>
1.2 linearlayout的子布局view01.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <imageview android:id="@+id/hezai_img" android:layout_width="12.5dp" android:layout_height="31.5dp"/> </linearlayout>
1.3 processtest01.java
package com.example.progresstest; import android.app.activity; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.widget.imageview; import android.widget.linearlayout; public class processtest01 extends activity { private linearlayout ll; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); setcontentview(r.layout.processtest01); ll = (linearlayout) findviewbyid(r.id.ll); setprocess(16); } private void setprocess(int green){ layoutinflater inflater = this.getlayoutinflater(); //有进度就填充绿色图片 for (int i = 0; i < green; i++) { view v = inflater.inflate(r.layout.view01, null); imageview img = (imageview) v.findviewbyid(r.id.hezai_img); img.setimageresource(r.drawable.green); ll.addview(v); } //没有进度就填充灰色图片 for (int i = 0; i < 24-green; i++) { view v = inflater.inflate(r.layout.view01, null); imageview img = (imageview) v.findviewbyid(r.id.hezai_img); img.setimageresource(r.drawable.gray); ll.addview(v); } } }
1.4 这里涉及了两个带边界的图片元素
最后得到的截图
这种方法有好处也有坏处。这种方法简单易懂,且耗内存少,运行速度快等,但若要不同的颜色,就要自己截不同大小,不同颜色的图片,并且还要左右带间距的,比较麻烦。下面的一种方法是自定义控件的方法,也是有好有坏。
2 用自定义控件的方法
2.1 myprocesstest.xml文件
<?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:orientation="vertical" > <com.example.progresstest.hezaiprogress android:layout_margintop="20dp" android:layout_gravity="center" android:id="@+id/process" android:layout_width="wrap_content" android:layout_height="wrap_content" > </com.example.progresstest.hezaiprogress> </linearlayout>
这里的com.example.progresstest是hezaiprogress所在的包名,hezaiprogress是自定义的控件代码。
2.2 hezaiprogress.java文件
package com.example.progresstest; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.graphics.rect; import android.util.attributeset; import android.util.log; import android.view.view; import android.view.view.measurespec; import android.widget.imageview; import android.widget.linearlayout; import android.widget.linearlayout.layoutparams; public class hezaiprogress extends view{ private int process = 10; private int width,height; private int h = 32; private int w = 12; private int dividewidth=5; private int maxcount = 24; private int processcolor=color.green; private int j = 1; private int num = 0; public int getprocesscolor() { return processcolor; } /** * 自定义颜色,输入的是“#ffffff”形式的颜色字符串 * @param processcolor */ public void setprocesscolor(string processcolor) { char c = processcolor.charat(0); int r = 0; int g = 0; int b = 0; //默认颜色为绿色 int rgb = color.green; if(c=='#'){ for(int i = 1;i<processcolor.length();i++){ c = processcolor.charat(i); if(i<3){ r += rorgorb(c,i); } else if(i<5){ g += rorgorb(c,i); }else{ b += rorgorb(c,i); } } rgb = color.rgb(r, g, b); } this.processcolor = rgb; } private int rorgorb(char c,int i){ num++; char b = 0; if(c>='0'&&c<='9'){ //j是用于判断是十六进制的哪一位 if(i==j){ //十六进制的右数第二位 b += integer.valueof(c)*16; } if(i==j+1){ //十六进制的右数第一位 b += integer.valueof(c); } } //十六进制的大写字母形式 if(c>='a'&&c<='f'){ if(i==j){ //ascii码减去55,如a的ascii码为65,减去55后等于10 b += ((int)c-55)*16; } if(i==j+1){ b += (int)c-55; } } //十六进制的小写字母形式 if(c>='a'&&c<='f'){ if(i==j){ //ascii码减去87,如a的ascii码为97,减去87后等于10 b += ((int)c-87)*16; } if(i==j+1){ b += (int)c-87; } } //若计数为偶数,则给j加2 if(num%2==0){ j=j+2; } return b; } //得到最大进度数 public int getmaxcount() { return maxcount; } //设置最大进度数 public void setmaxcount(int maxcount) { this.maxcount = maxcount; } //得到进度 public int getprocess() { return process; } //设置进度 public void setprocess(int process) { this.process = process; } //设置间隔宽度 public void setdividewidth(int dividewidth){ this.dividewidth = dividewidth; } public hezaiprogress(context context, attributeset attrs, int defstyle) { super(context, attrs, defstyle); // todo auto-generated constructor stub } public hezaiprogress(context context, attributeset attrs) { this(context, attrs,0); // todo auto-generated constructor stub } public hezaiprogress(context context) { this(context,null); // todo auto-generated constructor stub } @override protected void ondraw(canvas canvas) { // todo auto-generated method stub super.ondraw(canvas); sethezai(16, canvas); } //设置进度条高度 public void setprocessheight(int h){ if(h==0) this.h = 32; else this.h = h; } //设置进度条宽度 public void setprocesswidth(int w){ if(w==0) this.w = 12; else this.w = w; } private void sethezai(int process,canvas canvas){ rect rect; paint paint; int tmp = 2; //进度取整,如果进度条总宽度大于指定控件宽度,则只显示整数个进度 if(process*(w+tmp)+tmp>width) process = width/(w+dividewidth); //显示进度 for (int i = 0;i<process;i++){ rect = new rect(tmp, 2,w+tmp,h); paint = new paint(); tmp=tmp+w+dividewidth; paint.setcolor(processcolor); canvas.drawrect(rect, paint); } //显示灰色进度,及默认没进度状态状态 for (int i = 0; i < maxcount-process; i++) { rect = new rect(tmp, 2,w+tmp,h); paint = new paint(); tmp=tmp+w+dividewidth; paint.setcolor(color.rgb(211, 211, 211)); canvas.drawrect(rect, paint); } } //dp转换成px private int diptopx(int dip){ float scale = getcontext().getresources().getdisplaymetrics().density; return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));//加0.5是为了四舍五入 } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { // todo auto-generated method stub super.onmeasure(widthmeasurespec, heightmeasurespec); int widthspecmode = measurespec.getmode(widthmeasurespec); int heightspecmode = measurespec.getmode(heightmeasurespec); int widthspecsize = measurespec.getsize(widthmeasurespec); int heightspecsize = measurespec.getsize(heightmeasurespec); //measurespec.exactly,精确尺寸 if (widthspecmode == measurespec.exactly || widthspecmode == measurespec.at_most) { width = widthspecsize; } else { //如果不是精确尺寸,则显示设置尺寸或默认尺寸 width = w; } //measurespec.at_most,最大尺寸,只要不超过父控件允许的最大尺寸即可,measurespec.unspecified未指定尺寸 if (heightspecmode == measurespec.at_most || heightspecmode == measurespec.unspecified) { //显示设置尺寸或默认尺寸 height = diptopx(h); } else { height = heightspecsize; } //设置控件实际大小 setmeasureddimension(width, height); } }
代码里做了详细注释,这里就不在说了。
2.3 processtest.java
package com.example.progresstest; import android.app.activity; import android.os.bundle; public class processtest extends activity { private hezaiprogress process; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); setcontentview(r.layout.myprocesstest); process = (hezaiprogress) findviewbyid(r.id.process); //设置进度高度 process.setprocessheight(63); //设置进度宽度 process.setprocesswidth(25); //设置间隔宽度 process.setdividewidth(10); //设置进度颜色 process.setprocesscolor("#008b8b"); } }
这里比第一种方法好的地方就是可以随意改变高度,宽度,间隔宽度,进度颜色等,而且只需要一句代码就行,因为前面已经封装好了,但似乎比较耗内存。
这里是改变颜色后的截图,就是本博客的第一张图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio开发小型对话机器人app(实例代码)
Android通过Java sdk的方式接入OpenCv的方法
Android 通过cmake的方式接入opencv的方法步骤
Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)
网友评论