Android实现图片上传蒙层进度条

 更新时间:2022年09月19日 09:53:10   作者:青人  
这篇文章主要为大家详细介绍了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);
    }
}

好了,以上步骤就差不多完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 手机方向传感器的缺点及解决方法探究

    手机方向传感器的缺点及解决方法探究

    今天小编就为大家分享一篇关于手机方向传感器的缺点及解决方法探究,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Android实现计算器(计算表达式/计算小数点以及括号)

    Android实现计算器(计算表达式/计算小数点以及括号)

    这篇文章主要为大家详细介绍了Android实现计算器功能,计算表达式,能计算小数点以及括号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Android中使用Matrix控制图形变换和制作倒影效果的方法

    Android中使用Matrix控制图形变换和制作倒影效果的方法

    这篇文章主要介绍了Android中使用Matrix控制图形变换和制作倒影效果的方法,用Matrix来作矩阵变化十分强大,文中的制作倒影的例子便是一个十分巧妙的运用,需要的朋友可以参考下
    2016-04-04
  • 360浏览器文本框获得焦点后被android软键盘遮罩该怎么办

    360浏览器文本框获得焦点后被android软键盘遮罩该怎么办

    最近接了个项目,项目需求是这样的,站点上筛选按钮点击后弹出层(fixed),当输入框获取焦点以后弹出系统自带的软键盘,在android上十款浏览器挨个测试比对,发现在360浏览器弹出键盘以后获取焦点的文本框被软键盘覆盖了,下面分享我的解决办法
    2015-12-12
  • Android从网络中获得一张图片并显示在屏幕上的实例详解

    Android从网络中获得一张图片并显示在屏幕上的实例详解

    这篇文章主要介绍了Android从网络中获得一张图片并显示在屏幕上的实例详解的相关资料,希望通过本文能帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • Android插件化-RePlugin项目集成与使用详解

    Android插件化-RePlugin项目集成与使用详解

    这篇文章主要介绍了Android插件化-RePlugin项目集成与使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • android小动画:不断扩散的圆点

    android小动画:不断扩散的圆点

    这篇文章介绍了如何实现android小动画:不断扩散的圆点,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,下面的实例代码,大家可以看看
    2021-11-11
  • Android中js和原生交互的示例代码

    Android中js和原生交互的示例代码

    本篇文章主要介绍了Android中js和原生交互的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Android VelocityTracker使用案例详解

    Android VelocityTracker使用案例详解

    这篇文章主要介绍了Android VelocityTracker使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Android实现圆形图片或者圆角图片

    Android实现圆形图片或者圆角图片

    这篇文章主要为大家详细介绍了Android实现圆形图片或者圆角图片的代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论