Android实现图片上传蒙层进度条
作者:青人 发布时间:2022-05-06 04:35:43
标签:Android,上传,进度条
本文实例为大家分享了Android实现图片上传蒙层进度条的具体代码,供大家参考,具体内容如下
需求
上传图片时在图片上增加蒙层,蒙层随着上传的大小由下自上逐渐缩短。
分析
1、用xml文件画一个正方形的shape
2、利用ClipdDrawable来实现图片的动态剪切
3、使用AsynTask来控制图片的上传,然后动态的改变ClipDrawable.setLevel()方法中的值,这样基本就能达到图片上传蒙层的效果。
其中,本文中,在将图片数据流写向网络时,上传进度的值是根据正向的输出流的速度来判断的。也就是说不是服务器接收图片的速度,即使进度条表示图片已完全上传,也只是表示将图片上传到网络的大小。
实现
1、定义正方形的shape,drawable\mask.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--大小-->
<size android:height="82dp" android:width="82dp"/>
<!--<solid android:color="#3f000000" />-->
<solid android:color="#ffff4444"/>
</shape>
2、定义ClipDrawable由下自上的方式剪切,drawable\clip.xml
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/bg_feedback_mask"
android:clipOrientation="vertical"
android:gravity="top"/>
3、在主界面中定义ImageView,将clip.xml引入
<ImageView
android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY" />
<ImageView
android:id="@+id/picture_upload_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg_feedback_clip"
android:visibility="gone" />
第一个是放缩略图的,第一个是放进度条的,我们可以将它们放在FrameLayout中表示上下层的关系。
4、AsynTask处理上传图片
private class UploadPictureTask extends AsyncTask<String, Integer, UploadPictureResult> {
private String filePath;
private CountingTypedFile.ProgressListener listener;
public UploadPictureTask(String filePath) {
this.filePath = filePath;
}
@Override
protected void onPreExecute() {
uploadProgressImageView.setVisibility(View.VISIBLE);
uploadProgressImageView.getDrawable().setLevel(MAX_LEVEL);
super.onPreExecute();
}
@Override
protected UploadPictureResult doInBackground(String... params) {
File file = new File(filePath);
fileSize = file.length();
listener = new CountingTypedFile.ProgressListener() {
@Override
public void transferred(long num) {
publishProgress((int) ((num / (float) fileSize) * NUM_100));
}
};
UploadPictureResult uploadPictureResult = uploadImage(id, new CountingTypedFile("multipart/form-data", file, listener)
return uploadPictureResult;
}
@Override
protected void onProgressUpdate(Integer... values) {
//蒙层进度条
(uploadProgressImageView.getDrawable()).setLevel(MAX_LEVEL - values[0] * NUM_100);
}
@Override
protected void onPostExecute(UploadPictureResult uploadImageResult) {
findViewById(R.id.send_feedback).setVisibility(View.VISIBLE);
if (exception != null || uploadImageResult == null) {
Toast.makeText(FeedbackActivity.this, "上传失败", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(FeedbackActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
pictureUrl = uploadImageResult.getUrl();
super.onPostExecute(uploadImageResult);
}
}
上传进度条的监听需要自己写一个。
public class CountingTypedFile extends TypedFile {
private static final int BUFFER_SIZE = 4096;
private final ProgressListener listener;
/**
* Constructs a new typed file.
*
* @param mimeType
* @param file
* @throws NullPointerException if file or mimeType is null
*/
public CountingTypedFile(String mimeType, File file, ProgressListener listener) {
super(mimeType, file);
this.listener = listener;
}
@Override
public void writeTo(OutputStream out) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
FileInputStream in = new FileInputStream(super.file());
long total = 0;
try {
int length;
while ((length = in.read(buffer)) != -1) {
total += length;
this.listener.transferred(total);
out.write(buffer, 0, length);
}
} finally {
in.close();
}
}
public interface ProgressListener {
void transferred(long num);
}
}
来源:https://blog.csdn.net/fumier/article/details/49976729


猜你喜欢
- 引言相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计
- 目录1、Android如何动态更换桌面图标1.1使用场景1.2知识点1.3使用Activity-alias2、巨坑2.1App的覆盖2.2桌
- 本篇开始介绍Jetpack Compose 中的修饰符Modifier。修饰符可以用来执行以下操作:更改可组合项的大小、布局、行为和外观。添
- 最终效果项目地址https://github.com/Tecode/flutter_widget实现方法安装插件安装video_player
- 分类1.简单工厂模式2.工厂方法模式3.抽象工厂模式案例需求根据蛋糕的不同口味,分别创建苹果味和香蕉味的蛋糕实例方案一:简单工厂模式定义蛋糕
- kafka-console-consumer.sh解读kafka-console-consumer.sh 脚本是一个简易的消费者控制台。该
- Spring BeanPostProcessor执行顺序首先 Spring 通过调用构造方法创建 User 对象;User 对象创建好之后,
- 代码如下:@Test public void shengdanshu(){ //叶子层
- 传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets
- 本文为大家分享了Android仿小度语音助手的贝塞尔曲线动画,供大家参考,具体内容如下废话不多说,看下面的动图,和百度的还是有点点差别,我也
- Windows操作系统可以实现重命名文件操作,却不能实现批量重命名。本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规
- 本文实例讲述了C# Console利用mspaint打开图像并保存的方法。分享给大家供大家参考,具体如下:调用画图板压缩图片System.D
- 可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿
- 本文实例讲述了C#将Json解析成DateTable的方法。分享给大家供大家参考。具体实现方法如下:#region 将 Json 解析成 D
- storm操作zookeeper的主要函数都定义在命名空间backtype.storm.cluster中(即cluster.clj文件中)。
- 接收参数的方式:1.HttpServletRequest方式接收public ModelAndView test1(HttpServletR
- 最近遇到一个调试很久的问题,MyBatis 查询 Oracle 数据库查询结果与在客户端查询结果不一致。问题引入测试表、测试数据创建测试表、
- 前言大家对AOP应该都不陌生, 就算没有用过也肯定听说过,切面编程一直是一个热点的话题,AOP即Aspect Oriented Progra
- 前言众所周知在spring boot内,设置session过期时间只需在application.properties内添加server.se
- Java中的try-catch-finally异常处理一、异常处理异常(Exception):是在运行发生的不正常情况。原始异常处理:if(