亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android圖片上傳實現預覽效果

2020-04-11 10:54:15
字體:
來源:轉載
供稿:網友

首先具體分析一下,實現的功能,其中需求分析是必不可少的,需求、邏輯清除之后,再上手寫代碼,思路會很清晰。

1.多圖上傳首先得選擇圖片(這里項目需求是既可以拍照上傳也可以從相冊中選擇)

2.拍照上傳很簡單了網上也有很多例子,調用照相機,返回uri,獲取圖片

3.從相冊中選擇圖片

  •  3.1 獲取手機中的所有圖片
  •  3.2 將圖片存到自定義圖片數組中顯示
  •  3.3 自定義ViewPager瀏覽圖片

主要的邏輯大體是這樣,下面具體看一下實現:

一、首先看一下界面:

<com.view.NoScrollGridView           android:id="@+id/noScrollgridview"           android:layout_marginLeft="@dimen/smaller_space"           android:layout_marginRight="@dimen/smaller_space"           android:layout_width="match_parent"           android:layout_height="wrap_content"           android:horizontalSpacing="3dp"           android:listSelector="@color/transparent"           android:numColumns="3"           android:scrollbars="none"           android:layout_gravity="center"           android:layout_marginTop="@dimen/smaller_space"           android:verticalSpacing="5dp" /> 

是一個 NoScrollGridView,項目需要,所以用了不滾動的GridView,大家用GridView也是一樣的。

noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);     noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));     /*新建傳值給adapter*/     if (file == null) {       picAdapter = new PictureAdapter(this, 0, null);     } else {       //添加失敗的圖片到數組中       for (int i=0;i<file.getMulFailFilePaths().length;i++){         ImageItem imageItem = new ImageItem();         imageItem.setImagePath(file.getMulFailFilePaths()[i].trim());         Bimp.tempSelectBitmap.add(imageItem);       }       /*上傳失敗傳值給adapter*/       picAdapter = new PictureAdapter(this, 2, file);     } 

這個是初始化圖片數組,適配器(新建、上傳失敗、上傳成功的圖片我用的都是一個adapter)

ImageItem是圖片的模型,下面有它的屬性

//從圖庫選擇的圖片model public class ImageItem extends File implements Serializable {   @Id   public String imageId; //圖片id   public String thumbnailPath;    public String imagePath; //圖片路徑   private Bitmap bitmap;    public boolean isSelected = false;      public String getImageId() {     return imageId;   }   public void setImageId(String imageId) {     this.imageId = imageId;   }   public String getThumbnailPath() {     return thumbnailPath;   }   public void setThumbnailPath(String thumbnailPath) {     this.thumbnailPath = thumbnailPath;   }   public String getImagePath() {     return imagePath;   }   public void setImagePath(String imagePath) {     this.imagePath = imagePath;   }   public boolean isSelected() {     return isSelected;   }   public void setSelected(boolean isSelected) {     this.isSelected = isSelected;   } [java] view plain copy print?/*根據圖片路徑獲取圖片的bitmap*/ public Bitmap getBitmap() {        if(bitmap == null){     try {       bitmap = Bimp.revitionImageSize(imagePath);     } catch (IOException e) {       // TODO Auto-generated catch block       e.printStackTrace();     }   }   return bitmap; } public void setBitmap(Bitmap bitmap) {   this.bitmap = bitmap; } 

 接下來是適配器:

由于涉及到添加圖片,adapter中添加一個flag用來顯示新建的圖片,將選擇的圖片添加到公有的圖片數組中,初始化的時候加載圖片數組顯示。(大家在看的時候可以忽略掉我的flag)

@SuppressLint("HandlerLeak") public class PictureAdapter extends BaseAdapter {   private LayoutInflater inflater;   private int selectedPosition = -1;   private boolean shape;   private int flag = 0;//0 默認新建 1上傳成功 2上傳失敗   private AppItem_file file;   public boolean isShape() {     return shape;   }   private Activity context;    public void setShape(boolean shape) {     this.shape = shape;   }    public PictureAdapter(Activity context,int flag,AppItem_file file) {     this.context = context;     inflater = LayoutInflater.from(context);     this.flag = flag;     this.file = file;   }  //  public void update() { //    loading(); //  }    public int getCount() {     if (flag==0){  //新建圖片       if (Bimp.tempSelectBitmap.size() == 6) {         return 6;       }       return (Bimp.tempSelectBitmap.size() + 1);     }     else if (flag==1){ //上傳成功       return file.getFileList().size();     }     else { //上傳失敗       return file.getMulFailFilePaths().length;     }    }      public Object getItem(int arg0) {     if (flag==1){       return file.getFileList().get(arg0);     }else {       return file.getMulFailFilePaths()[arg0];     }   }    public long getItemId(int arg0) {     return arg0;   }    public void setSelectedPosition(int position) {     selectedPosition = position;   }    public int getSelectedPosition() {     return selectedPosition;   }    public View getView(int position, View convertView, ViewGroup parent) {     ViewHolder holder = null;     if (convertView == null) {       //根據圖片的數量加載不同布局       if (getCount()==1&&flag!=0){         convertView = inflater.inflate(R.layout.item_published_singal_item,             parent, false);       }       else {         convertView = inflater.inflate(R.layout.item_published_grida,             parent, false);       }        holder = new ViewHolder();       holder.image = (ImageView) convertView           .findViewById(R.id.item_grida_image);       convertView.setTag(holder);     } else {       holder = (ViewHolder) convertView.getTag();     }      /**      * 根據初始化adapter傳過來的flag值,去不同的地方找圖片      * flag=0,去Bimp的圖片數組中找      * flag=1,證明上傳成功的,去下載好的getFileList中找      * flag=2,為上傳失敗的,圖片保存在FailFile中的List<ImageItem>中      * 優化圖片顯示      */     if (flag==0){  //新建圖片       if (position == Bimp.tempSelectBitmap.size()) {         holder.image.setImageBitmap(BitmapFactory.decodeResource(             convertView.getResources(), R.drawable.icon_add_pic_unfocused));         if (position == 6) {           if (flag==0){             holder.image.setVisibility(View.GONE);           }         }       } else {         holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());       }     }     else if (flag==1){ //上傳成功 //      List<Integer> ids = new ArrayList<Integer>(); //      for (int i=0;i<file.getFileList().size();i++){ //        ids.add(file.getFileList().get(i).getS_id()); //      }       int id=file.getFileList().get(position).getS_id();       try { //        File file= NeedApplication.db.findById(File.class,id);         String fileBigImgUri =NeedApplication.db.findById(File.class,id).getFileUriBig();         if (fileBigImgUri!=null&&!"null".equals(fileBigImgUri))         ImageLoader.getInstance().displayImage((fileBigImgUri).trim(),holder.image);       } catch (DbException e) {         e.printStackTrace();       }     }     else { //上傳失敗         String url = "file://"+file.getMulFailFilePaths()[position].trim();         ImageLoader.getInstance().displayImage(url, holder.image);     }       return convertView;   }    public class ViewHolder {     public ImageView image;   }  } 

 下面是自定義相冊界面,用來選擇圖片的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="match_parent"   android:layout_height="match_parent"    android:background="#E1E0DE"   >    <RelativeLayout     android:id="@+id/headview"     android:layout_width="fill_parent"     android:layout_height="45dp"     android:background="@drawable/plugin_camera_title_bar"     android:gravity="center_vertical"     android:layout_marginBottom="3dp"     >     <Button       android:layout_width="60dp"       android:layout_height="wrap_content"       android:textSize="14sp"       android:textColor="#fff"       android:id="@+id/back"       android:text="相冊"       android:background="@drawable/plugin_camera_title_btn_back"       android:layout_marginTop="5dp"       android:layout_marginBottom="5dp"       android:layout_centerVertical="true"       />     <Button       android:layout_width="67dp"        android:layout_height="wrap_content"       android:textSize="14sp"       android:textColor="#fff"       android:id="@+id/cancel"       android:text="取消"       android:background="@drawable/plugin_camera_title_btn_cancel"       android:layout_centerVertical="true"       android:layout_marginRight="5dp"       android:layout_alignParentRight="true"        />   </RelativeLayout>    <RelativeLayout     android:id="@+id/bottom_layout"     android:layout_width="match_parent"     android:layout_height="50dp"     android:layout_alignParentBottom="true"     android:background="@drawable/plugin_camera_bottom_bar"     android:layout_marginTop="3dp"     >     <Button       android:id="@+id/preview"       android:layout_width="90dp"       android:layout_height="wrap_content"       android:layout_alignParentLeft="true"       android:layout_centerVertical="true"       android:layout_marginLeft="10dp"       android:text="預覽"       android:background="@drawable/plugin_camera_title_btn_preview"       />     <Button       android:id="@+id/ok_button"       android:layout_width="90dp"       android:layout_height="wrap_content"       android:layout_alignParentRight="true"       android:layout_centerVertical="true"       android:layout_marginRight="10dp"       android:background="@drawable/plugin_camera_ok_btn_state"       />   </RelativeLayout>    <GridView     android:id="@+id/myGrid"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:layout_above="@id/bottom_layout"     android:layout_below="@id/headview"     android:layout_centerInParent="true"     android:layout_marginTop="2dp"     android:horizontalSpacing="10dp"     android:numColumns="4"     android:verticalSpacing="10dp"     android:background="#E1E0DE" />   <TextView     android:id="@+id/myText"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:gravity="center"     android:text="相冊沒有圖片"     android:textColor="@color/black"     />  </RelativeLayout> 

 同樣也是用了GridView,獲取手機中的圖片,添加到數組中,顯示

這里用到了一個AlbumHelper(相冊幫助類),網上找的代碼,感覺挺好的

public List<ImageBucket> getImagesBucketList(boolean refresh) {     if (refresh || (!refresh && !hasBuildImagesBucketList)) {       buildImagesBucketList();     }     List<ImageBucket> tmpList = new ArrayList<ImageBucket>();     Iterator<Entry<String, ImageBucket>> itr = bucketList.entrySet()         .iterator();     while (itr.hasNext()) {       Entry<String, ImageBucket> entry = (Entry<String, ImageBucket>) itr           .next();       tmpList.add(entry.getValue());     }     return tmpList;   } 

獲取到數據源之后,該顯示了,也就是利用的獲取圖片幫助類里面的方法

// 初始化,給一些對象賦值   private void init() {     helper = AlbumHelper.getHelper();     helper.init(getApplicationContext());          contentList = helper.getImagesBucketList(false);     dataList = new ArrayList<ImageItem>();     for(int i = 0; i<contentList.size(); i++){       dataList.addAll( contentList.get(i).imageList );     }          back = (Button) findViewById(R.id.back);     cancel = (Button) findViewById(R.id.cancel);     cancel.setOnClickListener(new CancelListener());     back.setOnClickListener(new BackListener());     preview = (Button) findViewById(R.id.preview);     preview.setOnClickListener(new PreviewListener());     intent = getIntent();     Bundle bundle = intent.getExtras();     gridView = (GridView) findViewById(R.id.myGrid);     gridImageAdapter = new AlbumGridViewAdapter(mContext,dataList,Bimp.tempSelectBitmap);     gridView.setAdapter(gridImageAdapter);     tv = (TextView) findViewById(R.id.myText);     gridView.setEmptyView(tv);     okButton = (Button) findViewById(R.id.ok_button);     okButton.setText("完成"+"(" + Bimp.tempSelectBitmap.size()         + "/"+ NeedApplication.picNums+")");   } 
gridImageAdapter         .setOnItemClickListener(new AlbumGridViewAdapter.OnItemClickListener() {            @Override           public void onItemClick(final ToggleButton toggleButton,               int position, boolean isChecked,Button chooseBt) {             if (Bimp.tempSelectBitmap.size() >= NeedApplication.picNums) {               toggleButton.setChecked(false);               chooseBt.setVisibility(View.GONE);               if (!removeOneData(dataList.get(position))) {                 Toast.makeText(AlbumActivity.this, "超出可選圖片張數", Toast.LENGTH_SHORT).show();               }               return;             }             if (isChecked) {               chooseBt.setVisibility(View.VISIBLE);               Bimp.tempSelectBitmap.add(dataList.get(position));               okButton.setText("完成"+"(" + Bimp.tempSelectBitmap.size()                   + "/"+ NeedApplication.picNums+")");             } else {               Bimp.tempSelectBitmap.remove(dataList.get(position));               chooseBt.setVisibility(View.GONE);               okButton.setText("完成"+"(" + Bimp.tempSelectBitmap.size() + "/"+ NeedApplication.picNums+")");             }             isShowOkBt();           }         }); 

點擊圖片選擇加到公有圖片數組中顯示已選擇。

最后是預覽圖片,利用自定義viewpager,實現圖片滑動,下面貼兩張截圖吧:

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩另类字幕中文| 97在线视频观看| 欧美肥婆姓交大片| 亚洲男人天天操| 精品在线观看国产| 亚州欧美日韩中文视频| 影音先锋欧美在线资源| 日韩av免费看| 亚洲成人精品视频在线观看| 欧美精品第一页在线播放| 日韩欧美主播在线| 国产精品一区二区久久久| 久久成人一区二区| 91网站免费看| 日本精品久久久久影院| 国产精品96久久久久久| 亚洲欧美国产va在线影院| 国产精品国产福利国产秒拍| 91夜夜揉人人捏人人添红杏| 91精品视频专区| 久久久亚洲欧洲日产国码aⅴ| 97精品国产aⅴ7777| 欧美富婆性猛交| 欧美肥臀大乳一区二区免费视频| 欧美成人三级视频网站| 精品欧美一区二区三区| 91国在线精品国内播放| 久久久精品免费视频| 亚洲福利视频在线| 亚洲全黄一级网站| 91高潮精品免费porn| 亚洲精品国产精品自产a区红杏吧| 久久6免费高清热精品| 亚洲视频在线免费看| 亚洲大胆美女视频| 欧洲中文字幕国产精品| 欧美精品在线免费播放| 欧美另类极品videosbest最新版本| 91精品国产99久久久久久| 久久影视电视剧免费网站清宫辞电视| 国产激情视频一区| 欧美精品在线视频观看| 免费不卡在线观看av| 亚洲一区二区精品| 一区二区福利视频| 国产精品白嫩初高中害羞小美女| 国产mv久久久| 国产a级全部精品| 欧美日韩美女在线观看| 亚洲国产精品电影在线观看| 国产精品稀缺呦系列在线| 日韩电影免费观看中文字幕| 中文在线不卡视频| 国产国语刺激对白av不卡| 精品国产999| 色偷偷噜噜噜亚洲男人| 精品久久久久久久久国产字幕| 精品亚洲永久免费精品| 欧美色视频日本高清在线观看| 精品二区三区线观看| 国产精品国模在线| 亚洲精品久久久久| 亚洲精品电影网| 国产精品一区专区欧美日韩| 亚洲字幕在线观看| 欧美日韩中文在线观看| 久久久久这里只有精品| 久久久黄色av| 欧美剧在线观看| 欧美丰满老妇厨房牲生活| 欧美巨乳美女视频| 激情成人中文字幕| 欧美丝袜一区二区三区| 国产91精品黑色丝袜高跟鞋| 日本久久久久久久久久久| 1769国内精品视频在线播放| 国产精品999| 亚洲精品福利免费在线观看| 国产热re99久久6国产精品| 欧美成人精品不卡视频在线观看| 2018中文字幕一区二区三区| 久久免费视频观看| 日韩hd视频在线观看| 亚洲国产精品视频在线观看| 国产精品欧美亚洲777777| 黑人巨大精品欧美一区二区一视频| 国产成人在线视频| 57pao成人永久免费视频| 欧美久久精品一级黑人c片| 在线亚洲午夜片av大片| 国产精品18久久久久久麻辣| 国产一区二区日韩精品欧美精品| 欧美日韩国产999| 日韩成人av网| 91网站免费观看| 一区二区欧美亚洲| 成人h猎奇视频网站| 亚洲免费成人av电影| 2019日本中文字幕| 欧美电影免费观看高清| 国产一区二区三区欧美| 欧美精品videos另类日本| 久久精品视频网站| 日韩成人av在线| 色噜噜狠狠狠综合曰曰曰| 亚洲美女在线视频| 国产精品永久免费视频| 亚洲一区二区久久久久久久| 国产精品天天狠天天看| 91欧美精品成人综合在线观看| 国产91精品网站| 国产精品入口日韩视频大尺度| 欧美黑人极品猛少妇色xxxxx| 在线观看精品自拍私拍| 日韩中文字幕在线精品| 欧美中文在线免费| 欧美日韩亚洲高清| 奇门遁甲1982国语版免费观看高清| 亚洲精品免费av| 日韩精品亚洲元码| 久久精品国产v日韩v亚洲| 国产精品久久av| 中文字幕日韩综合av| 久久久久久久久久婷婷| 97精品国产97久久久久久| 精品久久久久久久久久ntr影视| 91在线色戒在线| 亚洲成人av中文字幕| 黑丝美女久久久| 亚洲国产精品999| 亚洲成色777777在线观看影院| 欧美福利视频网站| 日韩国产在线播放| 久久久91精品国产一区不卡| 国产91在线高潮白浆在线观看| 成人有码在线视频| 久久99国产综合精品女同| 国产一区二区三区在线看| 中文字幕亚洲专区| 亚洲日韩第一页| 日韩欧美精品中文字幕| 久久亚洲综合国产精品99麻豆精品福利| 亚洲毛片在线看| 3344国产精品免费看| 久久噜噜噜精品国产亚洲综合| 久久久国产一区二区| 久久久久亚洲精品国产| 国产精品网站入口| 亚洲福利精品在线| 黑人巨大精品欧美一区二区| 亚州欧美日韩中文视频| 中文字幕精品av| 中文字幕亚洲欧美日韩在线不卡| 国产亚洲视频在线| 国产在线精品一区免费香蕉| 欧美激情精品久久久久久变态| 久久久精品中文字幕| 亚洲国产91色在线| 欧美电影在线观看网站| 成人黄色免费在线观看| 日韩一区二区三区在线播放| 成人午夜在线视频一区| 黑人巨大精品欧美一区二区一视频| 国产视频精品免费播放|