android自定义ImageView仿图片上传示例
作者:小小蓝莓082 发布时间:2023-08-11 20:34:08
标签:android,上传图片
看下效果图
主要看下自定义view 代码
public class ProcessImageView extends ImageView{
private Context context;
private Paint paint;
private LogUtil log=LogUtil.getInstance();
int progress = 0;
private boolean flag;
public ProcessImageView(Context context) {
super(context);
}
public ProcessImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public ProcessImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context=context;
paint=new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setAntiAlias(true); //消除锯齿
paint.setStyle(Paint.Style.FILL); //设置paint为实心, Paint.Style.STROKE为空心
paint.setColor(Color.parseColor("#70000000")); //设置为半透明
canvas.drawRect(0,0,getWidth(),getHeight()-getHeight()*progress/100,paint); //这里getWidth() 获取的是image对象宽高度 xml值*2
paint.setColor(Color.parseColor("#00000000"));// 全透明
canvas.drawRect(0, getHeight() - getHeight() * progress / 100,
getWidth(), getHeight(), paint);
if(!flag){
paint.setTextSize(30);
paint.setColor(Color.parseColor("#FFFFFF"));
paint.setStrokeWidth(2);
Rect rect = new Rect();
paint.getTextBounds("100%", 0, "100%".length(), rect);// 确定文字的宽度
canvas.drawText(progress + "%", getWidth() / 2 - rect.width() / 2,
getHeight() / 2, paint);
}
}
public void setProgress(int progress) {
this.progress = progress;
if(progress==100){
flag=true;
}
postInvalidate();
}
}
里面代码很详细了。
然后看下 Activity代码
public class MainActivity extends AppCompatActivity {
ProcessImageView processImageView =null;
int progress=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
processImageView=(ProcessImageView) findViewById(R.id.image);
//模拟图片上传进度
new Thread(new Runnable() {
@Override
public void run() {
while (true){
if(progress==100){//图片上传完成
return;
}
progress++;
processImageView.setProgress(progress);
try{
Thread.sleep(200); //暂停0.2秒
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}).start();
}
}
下面来详细介绍view代码。
首先从图中可以看到 中间有个参数变化,这个进度值不断变化,我们再activity 中使用了一个线程 ,每隔0.2 秒会增加progress这个值,然后通过 processImageView.setProgress(progress); 改变view类中 progress重绘制这个定义view.
然后看下自定义view 类,主要onDraw()方法中.
绘制中分为三部分,
第一部分为上部分半透明区域
第二部分为下部分全透明区域
第三部分就是中间的progress值变化
先看第一个部分画出上部分半透明,
paint.setAntiAlias(true); //消除锯齿
paint.setStyle(Paint.Style.FILL); //设置paint为实心, Paint.Style.STROKE为空心
paint.setColor(Color.parseColor("#70000000")); //设置为半透明
canvas.drawRect(0,0,getWidth(),getHeight()-getHeight()*progress/100,paint);
第二部分画出下面透明区域
paint.setColor(Color.parseColor("#00000000"));// 全透明
canvas.drawRect(0, getHeight() - getHeight() * progress / 100,
getWidth(), getHeight(), paint);
第三部分动态改变字符串
if(!flag){
paint.setTextSize(30);
paint.setColor(Color.parseColor("#FFFFFF"));
paint.setStrokeWidth(2);
Rect rect = new Rect();
paint.getTextBounds("100%", 0, "100%".length(), rect);// 确定文字的宽度
canvas.drawText(progress + "%", getWidth() / 2 - rect.width() / 2,
getHeight() / 2, paint);
}
源码地址 http://xiazai.jb51.net/201701/yuanma/ProcessImageDemo_jb51.rar
来源:http://blog.csdn.net/xiabing082/article/details/54572987


猜你喜欢
- 使用 transient 修饰private transient String noColumn;使用 static 修饰private s
- 什么是 Retrofit ?Retrofit是Square开发的一个Android和Java的REST客户端库。这个库非常简单并且具有很多特
- Logback简介1、logback和log4j是同一个作者,logback可以看作是log4j的升级版2、logback分为三个模块, l
- 本文实例为大家分享了C#实现单位换算器的具体代码,供大家参考,具体内容如下一、阐述进制间转换:十六进制、十进制、八进制、二进制。长度间转换:
- 本文实例为大家分享了C#+EmguCV使用摄像头读取、保存视频的具体代码,供大家参考,具体内容如下在Emgucv中调用摄像头需要用到Vide
- 简介我们在开发web应用的时候,有时候为了适应浏览器大小的调整,需要动态对页面的组件进行位置的调整。这时候就会用到flow layout,也
- 什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需。比如我们的对象池,数据库连
- 相信最近看过我的文章的朋友对于Microsoft.Extensions.ObjectPool不陌生;复用、池化是在很多高性能场景的优化技巧,
- 本文实例展示了WinForm项目开发中NPOI用法,对于C#初学者有一定的借鉴价值。具体实例如下:private void ExportMe
- 首先在xml文件添加Spinner控件:<Spinner &n
- 1、找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件
- 在C#中用同一个dataset保存从数据库中取出的多张表:cmd.CommandText = "select * from tab
- Android Studio 打包 jar 及 aar 包创建工程 New -> Module -> Library在gradl
- 在项目中,有时候会用到领域枚举和DTO枚举的映射和转换。有一个现实的问题是:如果领域枚举项发生变化,而DTO枚举项没有及时更新,这样会造成映
- 前言实现轨迹回放,GMap.NET有对应的类GMapRoute。这个类函数很少,功能有限,只能实现简单的轨迹回放。要实现更复杂的轨迹回放,就
- 具体代码如下所示:public class Student { private String id; private
- 如下XML文件:(算是一个属性值比较多的xml文件。。。读取该Xml算是我在公司实际的一个任务)<?xml version="
- 题目:使用struts2自定义 * ,完成用户登陆才能访问权限的实现在session中存放user变量表示用户登陆,若user为空则用户没有
- 前言本篇开始讲解音频编辑的具体操作,从相对简单的音频裁剪开始。要进行音频裁剪,我的方案是开启一个Service服务用于音频裁剪的耗时操作,主
- 前言本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的