真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android應(yīng)用中怎么實現(xiàn)一個圖片預(yù)覽縮放功能

Android應(yīng)用中怎么實現(xiàn)一個圖片預(yù)覽縮放功能?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),龍門企業(yè)網(wǎng)站建設(shè),龍門品牌網(wǎng)站建設(shè),網(wǎng)站定制,龍門網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,龍門網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

具體實現(xiàn)方法如下

<?xml version="1.0" encoding="utf-8"?> 
 
 
  
 
  
 
  
 
  
  
 
  
 
  
 
  
 
  
 
 

好了,現(xiàn)在看主界面的代碼

public class ImageSelecteActivity extends AppCompatActivity { 
 
 private static final String TAG = "lzy"; 
 @BindView(R.id.ib_back) 
 ImageButton mButtonBack; 
 @BindView(R.id.tv_preview) 
 TextView mTextViewPreview; 
 @BindView(R.id.rv) 
 RecyclerView mRecyclerView; 
 @BindView(R.id.tv_allPic) 
 TextView mTextViewAllPic; 
 @BindView(R.id.bt_confirm) 
 Button mButtonConfirm; 
 private GalleryPopupWindow mPopupWindow; 
 //存儲每個目錄下的圖片路徑,key是文件名 
 private Map> mGroupMap = new HashMap<>(); 
 private List list = new ArrayList<>(); 
 //當(dāng)前文件夾顯示的圖片路徑 
 private List listPath = new ArrayList<>(); 
 //所選擇的圖片路徑集合 
 private ArrayList listSelectedPath = new ArrayList<>(); 
 
 
 private Handler mHandler = new Handler() { 
 @Override 
 public void handleMessage(Message msg) { 
  //掃描完成后 
  getGalleryList(); 
  listPath.clear(); 
  listPath.addAll(mGroupMap.get("所有圖片")); 
  adapter.update(listPath); 
  if (mPopupWindow != null) 
  mPopupWindow.notifyDataChanged(); 
 } 
 }; 
 private ImageSelectAdapter adapter; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_image_selecte); 
 ButterKnife.bind(this); 
 init(); 
 } 
 
 private void init() { 
 getImages(); 
 mRecyclerView.setLayoutManager(new GridLayoutManager(ImageSelecteActivity.this, 3)); 
 adapter = new ImageSelectAdapter(this, listPath); 
 mRecyclerView.setAdapter(adapter); 
 adapter.setOnCheckedChangedListener(onCheckedChangedListener); 
 } 
 
 @OnClick({R.id.ib_back, R.id.tv_preview, R.id.tv_allPic, R.id.bt_confirm}) 
 public void onClick(View view) { 
 switch (view.getId()) { 
  case R.id.ib_back: 
  finish(); 
  break; 
  case R.id.tv_preview://跳轉(zhuǎn)預(yù)覽界面 
  Intent intent = new Intent(ImageSelecteActivity.this, ImagePreviewActivity.class); 
  //把選中的圖片集合傳入預(yù)覽界面 
  intent.putStringArrayListExtra("pic", listSelectedPath); 
  startActivity(intent); 
  break; 
  case R.id.tv_allPic://選擇圖片文件夾 
  if (mPopupWindow == null) { 
   //把文件夾列表的集合傳入顯示 
   mPopupWindow = new GalleryPopupWindow(this, list); 
   mPopupWindow.setOnItemClickListener(new GalleryPopupWindow.OnItemClickListener() { 
   @Override 
   public void onItemClick(String fileName) { 
    //切換了文件夾,清除之前的選擇的信息 
    setButtonDisable(); 
    listPath.clear(); 
    listSelectedPath.clear(); 
    //把當(dāng)前選擇的文件夾內(nèi)圖片的路徑放入listPath,更新界面 
    listPath.addAll(mGroupMap.get(fileName)); 
    adapter.update(listPath); 
    mTextViewAllPic.setText(fileName); 
   } 
   }); 
  } 
  mPopupWindow.showAtLocation(mRecyclerView, Gravity.BOTTOM, 0, dp2px(50, ImageSelecteActivity.this)); 
  break; 
  case R.id.bt_confirm://確定 
  for (int i = 0; i < listSelectedPath.size(); i++) { 
   //這里可通過Glide把它轉(zhuǎn)為Bitmap 
   Glide.with(this).load("file://" + listSelectedPath.get(i)).asBitmap().into(new SimpleTarget() { 
   @Override 
   public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
    Log.i(TAG, "onResourceReady: " + resource); 
   } 
   }); 
  } 
  break; 
 } 
 } 
 
 /** 
 * dp轉(zhuǎn)px 
 */ 
 public static int dp2px(int dp, Context context) { 
 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, 
  context.getResources().getDisplayMetrics()); 
 } 
 
 //選擇圖片變化的監(jiān)聽 
 private ImageSelectAdapter.OnCheckedChangedListener onCheckedChangedListener = new ImageSelectAdapter.OnCheckedChangedListener() { 
 @Override 
 public void onChanged(boolean isChecked, String path, CheckBox cb, int position) { 
  if (isChecked) {//選中 
  if (listSelectedPath.size() == 9) { 
   Toast.makeText(ImageSelecteActivity.this, "最多選擇9張圖片", Toast.LENGTH_SHORT).show(); 
   //把點擊變?yōu)閏hecked的圖片變?yōu)闆]有checked 
   cb.setChecked(false); 
   adapter.setCheckedBoxFalse(position); 
   return; 
  } 
  //選中的圖片路徑加入集合 
  listSelectedPath.add(path); 
 
  } else {//取消選中 
  //從集合中移除 
  if (listSelectedPath.contains(path)) 
   listSelectedPath.remove(path); 
  } 
  //如果沒有選中的按鈕不可點擊 
  if (listSelectedPath.size() == 0) { 
  setButtonDisable(); 
  } else { 
  setButtonEnable(); 
  } 
 } 
 }; 
 
 //選中圖片時的按鈕狀態(tài) 
 private void setButtonEnable() { 
 mButtonConfirm.setBackgroundResource(R.drawable.selector_bt); 
 mButtonConfirm.setTextColor(Color.parseColor("#ffffff")); 
 mButtonConfirm.setEnabled(true); 
 mTextViewPreview.setEnabled(true); 
 mTextViewPreview.setTextColor(getResources().getColor(R.color.colorAccent)); 
 mButtonConfirm.setText("確定" + listSelectedPath.size() + "/9"); 
 } 
 
 //沒有選擇時按鈕狀態(tài) 
 private void setButtonDisable() { 
 mButtonConfirm.setBackgroundResource(R.drawable.shape_disable); 
 mButtonConfirm.setTextColor(Color.parseColor("#676767")); 
 mButtonConfirm.setEnabled(false); 
 mTextViewPreview.setEnabled(false); 
 mTextViewPreview.setTextColor(Color.parseColor("#BEBFBF")); 
 mButtonConfirm.setText("確定"); 
 } 
 
 /** 
 * 利用ContentProvider掃描手機中的圖片,此方法在運行在子線程中 
 */ 
 private void getImages() { 
 new Thread(new Runnable() { 
 
  @Override 
  public void run() { 
  Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
  ContentResolver mContentResolver = ImageSelecteActivity.this.getContentResolver(); 
  //只查詢jpeg和png的圖片 
//  Cursor mCursor = mContentResolver.query(mImageUri, null, 
//   MediaStore.Images.Media.MIME_TYPE + "=? or " 
//    + MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?", 
//   new String[]{"image/jpeg", "image/png", "image/jpg"}, MediaStore.Images.Media.DATE_MODIFIED); 
  Cursor mCursor = mContentResolver.query(mImageUri, null, null, null, 
   MediaStore.Images.Media.DATE_MODIFIED); 
  if (mCursor == null) { 
   return; 
  } 
  //存放所有圖片的路徑 
  List listAllPic = new ArrayList(); 
  while (mCursor.moveToNext()) { 
   //獲取圖片的路徑 
   String path = mCursor.getString(mCursor 
    .getColumnIndex(MediaStore.Images.Media.DATA)); 
 
   //獲取該圖片的父路徑名 
   String parentName = new File(path).getParentFile().getName(); 
   listAllPic.add(path); 
 
   //根據(jù)父路徑名將圖片放入到mGruopMap中 
   if (!mGroupMap.containsKey(parentName)) { 
   List chileList = new ArrayList(); 
   chileList.add(path); 
   mGroupMap.put(parentName, chileList); 
   } else { 
   mGroupMap.get(parentName).add(path); 
   } 
  } 
  //添加所有圖片 
  mGroupMap.put("所有圖片", listAllPic); 
  //通知Handler掃描圖片完成 
  mHandler.sendEmptyMessage(0); 
  mCursor.close(); 
  } 
 }).start(); 
 
 } 
 
 //獲取相冊文件夾列表 
 private void getGalleryList() { 
 Iterator>> iterator = mGroupMap.entrySet().iterator(); 
 while (iterator.hasNext()) { 
  Map.Entry> next = iterator.next(); 
  ImageBean imageBean = new ImageBean(); 
  imageBean.setFileName(next.getKey()); 
  imageBean.setFirstPicPath(next.getValue().get(0)); 
  imageBean.setCount(next.getValue().size()); 
  if (next.getKey().equals("所有圖片")) 
  list.add(0, imageBean); 
  else 
  list.add(imageBean); 
 } 
 } 
} 

·mGroupMap:這個是以文件夾名為key,文件夾內(nèi)的圖片路徑集合為value,也就是按照文件夾來分別存儲了所有圖片的路徑。
·listPath:保存的是當(dāng)前顯示在界面上的文件夾內(nèi)的圖片路徑集合
·listSelectedPath:保存用戶選中的圖片路徑
·list:保存的是ImageBean的集合,ImageBean保存了文件夾名、里面首張圖片的路徑以及里面所包含圖片的數(shù)量,當(dāng)切換文件夾時用于顯示
·getImages():這個方法就是用來掃描手機里圖片并保存的,這是在子線程中執(zhí)行的,顯示這可能是一個耗時的任務(wù)。通過ContentProvider獲取到一個包含所有圖片的Cursor,然后遍歷這個Cursor把所需的數(shù)據(jù)就保存在mGroupMap里面,最后利用Handler通知界面更新。
·getGalleryList():這個方法就是mGroupMap里面的數(shù)據(jù)來給list賦值,也就是產(chǎn)生一個現(xiàn)實文件夾列表所需的數(shù)據(jù)集合。
·GalleryPopupWindow也就是我們用于顯示文件列表的,在67--84行就是一些GalleryPopupWindow的設(shè)置,調(diào)用showAtLocation方法把PopupWindow顯示在距離底部50dp的位置,并設(shè)置了點擊的回調(diào),當(dāng)切換了一個文件夾后要做的相關(guān)操作就在這里進行。GalleryPopupWindow再待會再具體看看

接下來再看看中間RecyclerView的Adapter

public class ImageSelectAdapter extends RecyclerView.Adapter { 
 
 private Context context; 
 private List list = new ArrayList<>(); 
 private OnCheckedChangedListener onCheckedChangedListener; 
 private List listChecked = new ArrayList<>(); 
 
 public ImageSelectAdapter(Context context, List list) { 
 this.context = context; 
 this.list.addAll(list); 
 setListCheched(list); 
 } 
 
 public void update(List list) { 
 this.list.clear(); 
 this.list.addAll(list); 
 setListCheched(list); 
 notifyDataSetChanged(); 
 
 } 
 
 /** 
 * 設(shè)置listChecked的初始值 
 * 
 * @param list 
 */ 
 private void setListCheched(List list) { 
 listChecked.clear(); 
 for (int i = 0; i < list.size(); i++) { 
  listChecked.add(false); 
 } 
 } 
 
 //當(dāng)點擊超過了九張圖片,再點擊的設(shè)置為false 
 public void setCheckedBoxFalse(int pos) { 
 listChecked.set(pos, false); 
 } 
 
 public interface OnCheckedChangedListener { 
 /** 
  * @param isChecked 是否選中 
  * @param path 點擊的圖片路徑 
  * @param cb 點擊的CheckBox 
  * @param pos 點擊的位置 
  */ 
 void onChanged(boolean isChecked, String path, CheckBox cb, int pos); 
 } 
 
 public void setOnCheckedChangedListener(OnCheckedChangedListener onCheckedChangedListener) { 
 this.onCheckedChangedListener = onCheckedChangedListener; 
 } 
 
 @Override 
 public NViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 return new NViewHolder(LayoutInflater.from(context).inflate(R.layout.item_image_select, parent, false)); 
 } 
 
 @Override 
 public void onBindViewHolder(final NViewHolder holder, final int position) { 
 Glide.with(context).load("file://" + list.get(position)).into(holder.iv); 
 holder.cb.setChecked(listChecked.get(position)); 
 holder.itemView.setOnClickListener(new View.OnClickListener() { 
  @Override 
  public void onClick(View v) { 
  holder.cb.setChecked(!holder.cb.isChecked()); 
  if (holder.cb.isChecked()) { 
   listChecked.set(position, true); 
  } else { 
   listChecked.set(position, false); 
  } 
  if (onCheckedChangedListener != null) { 
   onCheckedChangedListener.onChanged(holder.cb.isChecked(), list.get(position), holder.cb, position); 
  } 
  } 
 }); 
 } 
 
 @Override 
 public int getItemCount() { 
 return list.size(); 
 } 
 
 public class NViewHolder extends RecyclerView.ViewHolder { 
 @BindView(R.id.iv_itemImageSelect) 
 ImageView iv; 
 @BindView(R.id.cb_itemImageSelect) 
 CheckBox cb; 
 
 public NViewHolder(View itemView) { 
  super(itemView); 
  ButterKnife.bind(this, itemView); 
 } 
 } 
 
} 

這里Item的布局文件就是一個ImageView加一個CheckBox,根據(jù)選中狀態(tài)改變CheckBox的狀態(tài),這里就不貼出來了。
·listChecked:這個集合是用來存儲每個位置是否Check的,如果在onBindViewHolder里面不設(shè)置CheckBox的狀態(tài)的話,由于復(fù)用問題會出問題,所以想出了用一個集合來保存它們狀態(tài)的方法,不知道大家有沒有其他更好的方法。
·OnCheckedChangedListener:向外暴露的接口,把點擊的位置等參數(shù)都傳到Activity中去。
·update():這個方法用來更新界面的,沒有采用直接調(diào)notifyDataSetChanged方法是因為,如果數(shù)據(jù)的數(shù)量變化了那么listChecked的數(shù)量也要發(fā)生變化才行這樣才能對應(yīng),所以寫了這個方法。

再接著看看GalleryPopupWindow

/** 
 * Created by lzy on 2017/2/8. 
 */ 
public class GalleryPopupWindow extends PopupWindow { 
 private static final String TAG = "lzy"; 
 
 RecyclerView mRecyclerView; 
 
 private Activity activity; 
 private GalleryPopupWindow.OnItemClickListener onItemClickListener; 
 private List list; 
 private GalleryAdapter adapter; 
 
 
 public GalleryPopupWindow(Activity context, List list) { 
 super(context); 
 this.activity = context; 
 this.list = list; 
 LayoutInflater inflater = (LayoutInflater) context 
  .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 View contentView = inflater.inflate(R.layout.popu_gallery, null); 
 initView(contentView); 
 
 int h = context.getWindowManager().getDefaultDisplay().getHeight(); 
 int w = context.getWindowManager().getDefaultDisplay().getWidth(); 
 this.setContentView(contentView); 
 this.setWidth(w); 
 this.setHeight(ImageSelecteActivity.dp2px(350, context)); 
 this.setFocusable(false); 
 this.setOutsideTouchable(true); 
 this.update(); 
 
 setBackgroundDrawable(new ColorDrawable(000000000)); 
 } 
 
 public void notifyDataChanged() { 
 adapter.notifyDataSetChanged(); 
 } 
 
 private void initView(View contentView) { 
 mRecyclerView = (RecyclerView) contentView.findViewById(R.id.rv_gallery); 
 mRecyclerView.setLayoutManager(new LinearLayoutManager(activity)); 
 adapter = new GalleryAdapter(list, activity); 
 adapter.setOnItemClickListener(new GalleryAdapter.OnItemClickListener() { 
  @Override 
  public void onItemClick(String fileName) { 
  if (onItemClickListener != null) { 
   onItemClickListener.onItemClick(fileName); 
   dismiss(); 
  } 
  } 
 }); 
 mRecyclerView.setAdapter(adapter); 
 
 } 
 
 //暴露點擊的接口 
 public interface OnItemClickListener { 
 /** 
  * @param keyValue 
  */ 
 void onItemClick(String keyValue); 
 } 
 
 public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
 this.onItemClickListener = onItemClickListener; 
 } 
} 

這個PopupWindow的布局文件就是一個RecyclerView,所以這里面也沒什么,也就是設(shè)置RecyclerView,然后向外暴露一個點擊的接口,用于Activity接收是點擊了哪個文件夾,所以接口參數(shù)也就是文件夾名,再看看這個PopupWindow的Adapter

/** 
 * Created by lzy on 2017/2/8. 
 */ 
public class GalleryAdapter extends RecyclerView.Adapter { 
 
 private Context context; 
 private List list; 
 private OnItemClickListener onItemClickListener; 
 //用于記錄是選中的哪一個文件夾 
 private int selectedPos; 
 
 public GalleryAdapter(List list, Context context) { 
 this.list = list; 
 this.context = context; 
 } 
 
 public interface OnItemClickListener { 
 void onItemClick(String fileName); 
 } 
 
 public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
 this.onItemClickListener = onItemClickListener; 
 } 
 
 @Override 
 public NViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 return new NViewHolder(LayoutInflater.from(context).inflate(R.layout.item_gallery, parent, false)); 
 } 
 
 @Override 
 public void onBindViewHolder(NViewHolder holder, final int position) { 
 holder.itemView.setOnClickListener(new View.OnClickListener() { 
  @Override 
  public void onClick(View v) { 
  selectedPos = position; 
  notifyDataSetChanged(); 
  if (onItemClickListener != null) { 
   onItemClickListener.onItemClick(list.get(position).getFileName()); 
  } 
  } 
 }); 
 if (position == selectedPos) { 
  holder.ivCheck.setVisibility(View.VISIBLE); 
 } else { 
  holder.ivCheck.setVisibility(View.GONE); 
 } 
 holder.tvCount.setText(list.get(position).getCount() + "張"); 
 holder.tvName.setText(list.get(position).getFileName()); 
 Glide.with(context).load("file://" + list.get(position).getFirstPicPath()).into(holder.iv); 
 } 
 
 @Override 
 public int getItemCount() { 
 return list.size(); 
 } 
 
 public class NViewHolder extends RecyclerView.ViewHolder { 
 @BindView(R.id.iv_itemGallery) 
 ImageView iv; 
 @BindView(R.id.tv_itemGallery_name) 
 TextView tvName; 
 @BindView(R.id.tv_itemGallery_count) 
 TextView tvCount; 
 @BindView(R.id.iv_itemGallery_check) 
 ImageView ivCheck; 
 
 public NViewHolder(View itemView) { 
  super(itemView); 
  ButterKnife.bind(this, itemView); 
 } 
 } 
 
} 

這里有個接口是把點擊的文件名傳遞給PopupWindow,然后再給Activity,selectedPos是用來記錄選擇的是哪一個文件夾,顯示對應(yīng)的CheckBox。

這里就差不多完成了,感興趣的可以下載Demo來看看。再說一下,這里顯示圖片都是采用的Glide,使用也很方便,我們獲取的圖片路徑都是文件路徑,如果要轉(zhuǎn)化為Bitmap也可以直接調(diào)用Glide的方法就可以輕松實現(xiàn),如下所示:

Glide.with(this).load("file://" + listSelectedPath.get(i)).asBitmap().into(new SimpleTarget() { 
   @Override 
   public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
    Log.i(TAG, "onResourceReady: " + resource); 
   } 
   }); 

其中找尋控件都沒有使用findViewById,而是采用的ButterKnife,節(jié)約了大量的時間,順便說說導(dǎo)入的方法
在app下面的build.gradle中加入以下:
apply plugin: 'com.neenbedankt.android-apt' 

apt 'com.jakewharton:butterknife-compiler:8.1.0' 
    compile 'com.github.bumptech.glide:glide:3.5.2' 

項目下面的build.gradle

//添加apt插件 
 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 

添加插件
File->Setting->Plugins  搜索zelezny,如下所示

Android應(yīng)用中怎么實現(xiàn)一個圖片預(yù)覽縮放功能

當(dāng)需要使用的時候,直接在光標(biāo)移動到布局文件,點擊Alt+Insert,選擇Generate ButterKnife Injections

Android應(yīng)用中怎么實現(xiàn)一個圖片預(yù)覽縮放功能

看完上述內(nèi)容,你們掌握Android應(yīng)用中怎么實現(xiàn)一個圖片預(yù)覽縮放功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


文章標(biāo)題:Android應(yīng)用中怎么實現(xiàn)一個圖片預(yù)覽縮放功能
新聞來源:http://weahome.cn/article/jgdced.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部