Android實(shí)現(xiàn)圖片上傳蒙層進(jìn)度條
本文實(shí)例為大家分享了Android實(shí)現(xiàn)圖片上傳蒙層進(jìn)度條的具體代碼,供大家參考,具體內(nèi)容如下
需求
上傳圖片時(shí)在圖片上增加蒙層,蒙層隨著上傳的大小由下自上逐漸縮短。
分析
1、用xml文件畫(huà)一個(gè)正方形的shape
2、利用ClipdDrawable來(lái)實(shí)現(xiàn)圖片的動(dòng)態(tài)剪切
3、使用AsynTask來(lái)控制圖片的上傳,然后動(dòng)態(tài)的改變ClipDrawable.setLevel()方法中的值,這樣基本就能達(dá)到圖片上傳蒙層的效果。
其中,本文中,在將圖片數(shù)據(jù)流寫(xiě)向網(wǎng)絡(luò)時(shí),上傳進(jìn)度的值是根據(jù)正向的輸出流的速度來(lái)判斷的。也就是說(shuō)不是服務(wù)器接收?qǐng)D片的速度,即使進(jìn)度條表示圖片已完全上傳,也只是表示將圖片上傳到網(wǎng)絡(luò)的大小。
實(shí)現(xiàn)
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" />
第一個(gè)是放縮略圖的,第一個(gè)是放進(jìn)度條的,我們可以將它們放在FrameLayout中表示上下層的關(guān)系。
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) {
? ? ? ? ? ? //蒙層進(jìn)度條
? ? ? ? ? ? (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);
? ? ? ? }
? ? }上傳進(jìn)度條的監(jiān)聽(tīng)需要自己寫(xiě)一個(gè)。
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);
? ? }
}好了,以上步驟就差不多完成了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android ProgressDialog用法之實(shí)現(xiàn)app上傳文件進(jìn)度條轉(zhuǎn)圈效果
- Android Volley擴(kuò)展實(shí)現(xiàn)支持進(jìn)度條的文件上傳功能
- Android實(shí)現(xiàn)文件上傳和下載倒計(jì)時(shí)功能的圓形進(jìn)度條
- Android上傳文件到服務(wù)端并顯示進(jìn)度條
- Android帶進(jìn)度條的文件上傳示例(使用AsyncTask異步任務(wù))
- Android頁(yè)面中引導(dǎo)蒙層的使用方法詳解
- Android實(shí)現(xiàn)新手引導(dǎo)半透明蒙層效果
- Android 新手引導(dǎo)蒙層效果實(shí)現(xiàn)代碼示例
相關(guān)文章
詳解Android如何自定義view實(shí)現(xiàn)圓形進(jìn)度條
Android中實(shí)現(xiàn)進(jìn)度條有很多種方式,自定義進(jìn)度條一般是繼承progressBar或繼承view來(lái)實(shí)現(xiàn)。本文將介紹通過(guò)自定義View實(shí)現(xiàn)的圓形進(jìn)度條,感興趣的可以動(dòng)手試一試2022-01-01
Android開(kāi)發(fā)基礎(chǔ)實(shí)現(xiàn)最簡(jiǎn)單的視頻播放示例
這篇文章主要為大家介紹了Android開(kāi)發(fā)基礎(chǔ)實(shí)現(xiàn)最簡(jiǎn)單的視頻播放示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Android協(xié)程的7個(gè)重要知識(shí)點(diǎn)匯總
在現(xiàn)代Android應(yīng)用開(kāi)發(fā)中,協(xié)程(Coroutine)已經(jīng)成為一種不可或缺的技術(shù),它不僅簡(jiǎn)化了異步編程,還提供了許多強(qiáng)大的工具和功能,可以在高階場(chǎng)景中發(fā)揮出色的表現(xiàn),本文將深入探討Coroutine重要知識(shí)點(diǎn),幫助開(kāi)發(fā)者更好地利用Coroutine來(lái)構(gòu)建高效的Android應(yīng)用2023-09-09
Android仿美團(tuán)淘寶實(shí)現(xiàn)多級(jí)下拉列表菜單功能
這篇文章主要介紹了Android仿美團(tuán)淘寶實(shí)現(xiàn)多級(jí)下拉列表菜單功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
詳解Android中實(shí)現(xiàn)Redux方法
本篇文章給大家通過(guò)代碼實(shí)例教學(xué)Android中實(shí)現(xiàn)Redux的方法,有需要的朋友跟著參考下吧。2018-01-01
android 多點(diǎn)觸摸圖片縮放的具體實(shí)現(xiàn)方法
2013-06-06
Android組件TabHost實(shí)現(xiàn)頁(yè)面中多個(gè)選項(xiàng)卡切換效果
這篇文章主要為大家詳細(xì)介紹了Android組件TabHost實(shí)現(xiàn)頁(yè)面中多個(gè)選項(xiàng)卡切換效果的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05
android獲取及監(jiān)聽(tīng)手機(jī)網(wǎng)絡(luò)狀態(tài)
大家好,本篇文章主要講的是android獲取及監(jiān)聽(tīng)手機(jī)網(wǎng)絡(luò)狀態(tài),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2022-01-01
Okhttp、Retrofit進(jìn)度獲取的方法(一行代碼搞定)
本篇文章主要介紹了Okhttp、Retrofit進(jìn)度獲取的方法(一行代碼搞定),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

