快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

万博max官网手机版_酒文化网进入



我钻研了下微信的本舆图片选择的Demo,自己模仿的写了下分享给大年夜家,盼望对今后有这样子需求的同伙有一点赞助吧,主要应用的是ContentProvider扫描手机中的图片,并用GridView将图片显示出来,关于GridView和ListView显示图片的问题,不停是一个很头疼的问题,由于我们手机的内存有限,手机给每个利用法度榜样分配的内存也有限,以是图片多的环境下很轻易伴跟着OOM的发生,不过现在也有很多的开源的图片显示框架,大年夜家有兴趣的可以去懂得懂得,本日我的这篇文章应用的是LruCache这个类(http://www.fengfly.com/plus/view-214548-1.html)以及对图片进行相对应的裁剪,这样也可以只管即便的避免OOM的发生,我们先看下微信的效果吧

接下来便是主界面的结构啦,上面的导航栏我没有加进去,只有下面的GridView,以是说主界面结构中只有一个GridView

RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"

android:layout_height="match_parent" >

GridViewandroid:id="@+id/main_grid"

android:layout_width="match_parent"android:layout_height="match_parent"

android:listSelector="@android:color/transparent"android:cacheColorHint="@android:color/transparent"

android:stretchMode="columnWidth"android:horizontalSpacing="20dip"

android:gravity="center"android:verticalSpacing="20dip"

android:columnWidth="90dip"android:numColumns="2" >

GridView>

RelativeLayout>

接下来便是GridView的Item的结构,看上面的图也行你会觉得他的效果是2张图片添加的效果,着实不是,后面的叠加效果只是一张背景图片而已,代码先贴上来

xml version="1.0" encoding="UTF-8"?>

RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"

android:layout_height="wrap_content" >

FrameLayoutandroid:id="@+id/framelayout"

android:layout_width="fill_parent"android:layout_height="wrap_content" >

com.example.imagescan.MyImageView

android:id="@+id/group_image"android:background="@drawable/albums_bg"

android:src="@drawable/friends_sends_pictures_no"android:paddingLeft="20dip"

android:paddingRight="20dip"android:paddingTop="18dip"

android:paddingBottom="30dip"android:scaleType="fitXY"

android:layout_width="fill_parent"android:layout_height="150dip" />

TextView

android:id="@+id/group_count"android:layout_width="wrap_content"

android:layout_height="wrap_content"android:background="@drawable/albums_icon_bg"

android:gravity="center"android:layout_marginBottom="10dip"

android:text="5"android:layout_gravity="bottom|center_horizontal" />

FrameLayout>

TextViewandroid:id="@+id/group_title"

android:layout_width="fill_parent"android:layout_height="wrap_content万博max官网手机版"

android:gravity="center"android:layout_below="@id/framelayout"

android:layout_centerHorizontal="true"android:ellipsize="end"

android:singleLine="true"android:text="Camera"

android:textSize="16sp" />

RelativeLayout>

看到上面的结构代码,也行你已经发清楚明了,上面应用的是自定义的MyImageView,我先不说这个自定义MyImageView的感化,待会再给大年夜家说,我们继承看代码

第一个界面的主要代码

package com.example.imagescan;

import java.io.File;

import java.util.ArrayList; import java.util.HashMap;

import java.util.Iterator; import java.util.List;

import java.util.Map;

import android.app.Activity; import android.app.ProgressDialog;

import android.content.ContentResolver; import android.content.Intent;

import android.database.Cursor; import android.net.Uri;

import android.os.Bund万博max官网手机版le; import android.os.Handler;

import android.os.Message; import android.provider.MediaStore;

import android.view.View; import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView;

/**

** @author xiaanming

**

*/ public class MainActivity extends Activity {

private HashMap> mGruopMap = new HashMap>();private List list = new ArrayList();

private final static int SCAN_OK = 1;private ProgressDialog mProgressDialog;

private GroupAdapter adapter;private GridView mGroupGridView;

private Handler mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {super.handleMessage(msg);

switch (msg.what) {case SCAN_OK:

//关闭进度条mProgressDialog.dismiss();

adapter = new GroupAdapter(MainActivity.this, list = subGroupOfImage(mGruopMap), mGroupGridView);

mGroupGridView.setAdapter(adapter);break;

}}

};

@Override

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mGroupGridView = (GridView) findViewById(R.id.main_grid);

getImages();

mGroupGridView.setOnItemClickListener(new OnItemClickListener() {

@Overridepublic void onItemClick(AdapterView parent, View view,

int position, long id) {List childList = mGruopMap.get(list.get(position).getFolderName());

Intent mIntent = new Intent(MainActivity.this, ShowImageActivity.class);

mIntent.putStringArrayListExtra("data", (ArrayList)childList);startActivity(mIntent);

}

});

}

/**

* 使用ContentProvider扫描手机中的图片,此措施在运行在子线程中*/

private void getImages() {//显示进度条

mProgressDialog = ProgressDialog.show(this, null, "正在加载...");

new Thread(new Runnable() {

@Overridepublic void run() {

Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;ContentResolver mContentResolver = MainActivity.this.getContentResolver();

//只查询jpeg和png的图片

Cursor mCursor = mContentResolver.query(mImageUri, null,MediaStore.Images.Media.MIME_TYPE + "=? or "

+ MediaStore.Images.Media.MIME_TYPE + "=?",new String[] { "image/jpeg", "image/png" }, MediaStore.Images.Media.DATE_MODIFIED);

if(mCursor == null){

return;}

while (mCursor.moveToNext()) {

//获取图片的路径String path = mCursor.getString(mCursor

.getColumnIndex(MediaStore.Images.Media.DATA));

//获取该图片的父路径名String parentName = new File(path).getParentFile().getName();

//根据父路径名将图片放入到mGruopMap中if (!mGruopMap.containsKey(parentName)) {

List chileList = new ArrayList();chileList.add(path);

mGruopMap.put(parentName, chileList);} else {

mGruopMap.get(parentName).add(path);}

}

//看护Handler扫描图片完成mHandler.sendEmptyMessage(SCAN_OK);

mCursor.close();}

}).start();

}

/**

* 组装分组界面GridView的数据源,由于我们扫描手机的时刻将图片信息放在HashMap中* 以是必要遍历HashMap将数据组装成List

** @param mGruopMap

* @return*/

private List subGroupOfImage(HashMap> mGruopMap){if(mGruopMap.size() == 0){

return null;}

List list = new ArrayList();

Iterator>> it = mGruopMap.entrySet().iterator();while (it.hasNext()) {

Map.Entry> entry = it.next();ImageBean mImageBean = new ImageBean();

String key = entry.getKey();List value = entry.getValue();

mImageBean.setFolderName(key);

mImageBean.setImageCounts(value.size());mImageBean.setTopImagePath(value.get(0));//获取该组的第一张图片

list.add(mImageBean);

}

return list;

}

}

首先看getImages()这个措施,该措施是应用ContentProvider将手机中的图片扫描出来,我这里只扫描了手机的外部存储中的图片,因为手机中可能存在很多的图片,扫描图片又对照耗时,以是我们在这里开启了子线程去获取图片,扫描的图片都寄放在Cursor中,我们先要将图片按照文件夹进行分类,我们应用了HashMap来进行分类并将结果存储到mGruopMap(Key是文件夹名,Value是文件夹中的图片路径的List)中,分类完了关闭Cursor并使用Handler来看护主线程

然后是subGroupOfImage()措施,改措施是将mGruopMap的数据组装到List中,在List中寄放GridView中的每个item的数据工具ImageBean, 遍历HashMap工具,详细的逻辑看代码,之后便是给GridView设置Adapter。

设置item点击事故,点击文件夹跳转到展示文件夹图片的Activity, 我们必要通报每个文件夹中的图片的路径的聚拢

看GroupAdapter的代码之前,我们先看一个对照紧张的类,本舆图片加载器NativeImageLoader

package com.example.imagescan;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import android.graphics.Bitmap; import android.graphics.BitmapFactory;

import android.graphics.Point; import android.os.Handler;

import android.os.Message; import android.support.v4.util.LruCache;

/**

* 本舆图片加载器,采纳的是异步解析本舆图片,单例模式使用getInstance()获取NativeImageLoader实例* 调用loadNativeImage()措施加载本舆图片,此类可作为一个加载本舆图片的对象类

**

* @author xiaanming*

*/ public class NativeImageLoader {

private LruCache mMemoryCache;private static NativeImageLoader mInstance = new NativeImageLoa万博max官网手机版der();

private ExecutorService mImageThreadPool = Executors.newFixedThreadPool(1);

private NativeImageLoader(){

//获图利用法度榜样的最大年夜内存final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

//用最大年夜内存的1/4来存储图片

final int cacheSize = maxMemory / 4;mMemoryCache = new LruCache(cacheSize) {

//获取每张图片的大年夜小

@Overrideprotected int sizeOf(String key, Bitmap bitmap) {

return bitmap.getRowBytes() * bitmap.getHeight() / 1024;}

};}

/**

* 经由过程此措施来获取NativeImageLoader的实例* @return

*/public static NativeImageLoader getInstance(){

return mInstance;}

/奸淫 加载本舆图片,对图片不进行裁剪

* @param path* @param mCallBack

* @return*/

public Bitmap loadNativeImage(final String path, final NativeImageCallBack mCallBack){return this.loadNativeImage(path, null, mCallBack);

}

/奸淫 此措施来加载本舆图片,这里的mPoint是用来封装ImageView的宽和高,我们会根据ImageView控件的大年夜小来裁剪Bitmap

* 假如你不想裁剪图片,调用loadNativeImage(final String path, final NativeImageCallBack mCallBack)来加载* @param path

* @param mPoint* @param mCallBack

* @return*/

public Bitmap loadNativeImage(final String path, final Point mPoint, final NativeImageCallBack mCallBack){//先获取内存中的Bitmap

Bitmap bitmap = getBitmapFromMemCache(path);

final Handler mHander = new Handler(){

@Overridepublic void handleMessage(Message msg) {

super.handleMessage(msg);mCallBack.onImageLoader((Bitmap)msg.obj, path);

}

};

//若该Bitmap不在内存缓存中,则启用线程去加载本地的图片,并将Bitmap加入到mMemoryCache中if(bitmap == null){

mImageThreadPool.execute(new Runnable() {

@Overridepublic void run() {

//先获取图片的缩略图Bitmap mBitmap = decodeThumbBitmapForFile(path, mPoint == null ? 0: mPoint.x, mPoint == null ? 0: mPoint.y);

Message msg = mHander.obtainMessage();msg.obj = mBitmap;

mHander.sendMessage(msg);

//将图片加入到内存缓存addBitmapToMemoryCache(path, mBitmap);

}});

}return bitmap;

}

/**

* 往内存缓存中添加Bitmap*

* @param key* @param bitmap

*/private void addBitmapToMemoryCache(String key, Bitmap bitmap) {

if (getBitmapFromMemCache(key) == null && bitmap != null) {mMemoryCache.put(key, bitmap);

}}

/**

* 根据key来获取内存中的图片* @param key

* @return*/

private Bitmap getBitmapFromMemCache(String key) {return mMemoryCache.get(key);

}

/**

* 根据View(主如果ImageView)的宽和高来获取图片的缩略图* @param path

* @param viewWidth* @param viewHeight

* @return*/

private Bitmap decodeThumbBitmapForFile(String path, int viewWidth, int viewHeight){BitmapFactory.Options options = new BitmapFactory.Options();

//设置为true,表示解析Bitmap工具,该工具不占内存options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(path, options);//设置缩放比例

options.inSampleSize = computeScale(options, viewWidth, viewHeight);

//设置为false,解析Bitmap工具加入到内存中options.inJustDecodeBounds = false;

return BitmapFactory.decodeFile(path, options);

}

/**

* 根据View(主如果ImageView)的宽和高来谋略Bitmap缩放比例。默认不缩放* @param options

* @param width* @param height

*/private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){

int inSampleSize = 1;if(viewWidth == 0 || viewWidth == 0){

return inSampleSize;}

int bitmapWidth = options.outWidth;int bitmapHeight = options.outHeight;

//要是Bitmap的宽度或高度大年夜于我们设定图片的View的宽高,则谋略缩放比例

if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);

int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);

//为了包管图片不缩放变形,我们取宽高比例最小的那个inSampleSize = widthScale

}return inSampleSize;

}

/**

* 加载本舆图片的回调接口*

* @author xiaanming*

*/public interface NativeImageCallBack{

/奸淫 当子线程加载完了本地的图片,将Bitmap和图片路径回调在此措施中

* @param bitmap* @param path

*/public void onImageLoader(Bitmap bitmap, String path);

} }

该类是一个单例类,供给了本舆图片加载,内存缓存,裁剪等逻辑,该类在加载本舆图片的时刻采纳的是异步加载的要领,对付大年夜图片的加载也是对照耗时的,以是采纳子线程的要领去加载,对付图片的缓存机制应用的是LruCache,应用手机分配给利用法度榜样内存的1/4用来缓存图片,除了应用LruCache缓存图片之外,还对图片进行了裁剪,举个很简单的例子,要是我们的控件大年夜小是100 * 100, 而我们的图片是400*400,我们加载这么大年夜的图片必要很多的内存,以是我们采纳了图片裁剪,根据控件的大年夜小来确定图片的裁剪比例,从而减小内存的耗损,提过GridView滑动的流通度,先容里面几个对照紧张的措施,computeScale()谋略图片必要裁剪的比例,根据控件的大年夜小和图片的大年夜小确定比例,假如图片比控件大年夜,我们就进行裁剪,否则不必要。decodeThumbBitmapForFile()措施是根据谋略好了图片裁剪的比例之后从文件中加载图片,我们先设置options.inJustDecodeBounds = true表示解析不占用内存,然则我们能获取图片的详细大年夜小,使用computeScale()谋略好比例,在将options.inJustDecodeBounds=false,再次解析Bitmap,这样子就对图片进行了裁剪。

loadNativeImage(final String path, final Point mPoint, final NativeImageCallBack mCallBack)我们在客户端只必要调用该措施就能获取到Bitmap工具,里面的详细逻辑是先判断内存缓存LruCache中是否存在该Bitmap,不存在就开启子线程去读取,为了方便治理加载本舆图片线程,这里应用了线程池,池中只能容纳一个线程,读取完了本舆图片先将Bitmap加入到LruCache中,保存的Key为图片路径,然后再应用Handler看护主线程图片加载好了,之后将Bitmap和路径回调到措施onImageLoader(Bitmap bitmap, String path)中,该措施的mPoint是用来封装控件的宽和高的工具,假如纰谬图片进行裁剪直接这个措施的重载措施loadNativeImage(final String path, final NativeImageCallBack mCallBack)就行了,逻辑是一样的,只是这个措施纰谬图片进行裁剪

接下来便是GridView的Adapter类的代码

package com.example.imagescan;

import java.util.List;

import android.content.Context;

import android.graphics.Bitmap; import android.graphics.Point;

import android.view.LayoutInflater; import android.view.View;

import android.view.ViewGroup; import android.widget.BaseAdapter;

import android.widget.GridView; import android.widget.ImageView;

import android.widget.TextView;

import com.example.imagescan.MyImageView.OnMeasureListener; import com.example.imagescan.NativeImageLoader.NativeImageCallBack;

public class GroupAdapter extends BaseAdapter{

private List list;private Point mPoint = new Point(0, 0);//用来封装ImageView的宽和高的工具

private GridView mGridView;protected LayoutInflater mInflater;

@Override

public int getCount() {return list.size();

}

@Overridepublic Object getItem(int position) {

return list.get(position);}

@Overridepublic long getItemId(int position) {

return position;}

public GroupAdapter(Context context, List list, GridView mGridView){

this.list = list;this.mGridView = mGridView;

mInflater = LayoutInflater.from(context);}

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {

final ViewHolder viewHolder;ImageBean mImageBean = list.get(position);

String path = mImageBean.getTopImagePath();if(convertView == null){

viewHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.grid_group_item, null);

viewHolder.mImageView = (MyImageView) convertView.findViewById(R.id.group_image);viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.group_title);

viewHolder.mTextViewCounts = (TextView) convertView.findViewById(R.id.group_count);

//用来监听ImageView的宽和高viewHolder.mImageView.setOnMeasureListener(new OnMeasureListener() {

@Override

public void onMeasureSize(int width, int height) {mPoint.set(width, height);

}});

convertView.setTag(viewHolder);

}else{viewHolder = (ViewHolder) convertView.getTag();

viewHolder.mImageView.setImageResource(R.drawable.friends_sends_pictures_no);}

viewHolder.mTextViewTitle.setText(mImageBean.getFolderName());

viewHolder.mTextViewCounts.setText(Integer.toString(mImageBean.getImageCounts()));//给ImageView设置路径Tag,这是异步加载图片的小技术

viewHolder.mImageView.setTag(path);

//使用NativeImageLoader类加载本舆图片

Bitmap bitmap = NativeImageLoader.getInstance().loadNativeImage(path, mPoint, new NativeImageCallBack() {

@Overridepublic void onImageLoader(Bitmap bitmap, String path) {

ImageView mImageView = (ImageView) mGridView.findViewWithTag(path);if(bitmap != null && mImageView != null){

mImageView.setImageBitmap(bitmap);}

}});

if(bitmap != null){

viewHolder.mImageView.setImageBitmap(bitmap);}else{

viewHolder.mImageView.setImageResource(R.drawable.friends_sends_pictures_no);}

return convertView;}

public static class ViewHolder{

public MyImageView mImageView;public TextView mTextViewTitle;

public TextView mTextViewCounts;}

}

首先我们将每个item的图片路径设置到该ImageView上面,然后使用NativeImageLoader来加载本舆图片,很通俗,然则我们想在getView()中获取ImageView的宽和高存在问题,在getView()里面刚开始显示item的时刻使用ImageView.getWidth()获取的都是0,这个对照愁闷,然则我们想要获取ImageView的宽和高怎么办呢?于是我想到了自定义Image View,在onMeasure()中使用回调的模式主动看护我ImageView丈量的宽和高,然则这有一个小小的问题,便是显示GridView的第一个item的时刻,获取的宽和高照样0,第二个就能正常获取了,第一个宽和高为0,我们纰谬第一张图片进行裁剪而已,在效率上也没啥问题,不知道大年夜家有没有好的措施,可以在getView()中获取Item中某个控件的宽和高。

自定义MyImageView的代码,我们只必要设置OnMeasureListener监听,当MyImageView丈量完毕之后,就会将丈量的宽和高回调到onMeasureSize()中,然后我们可以根据MyImageView的大年夜小来裁剪图片

package com.example.imagescan;

import android.content.Context;

import android.util.AttributeSet; import android.widget.ImageView;

public class MyImageView extends ImageView {

private OnMeasureListener onMeasureListener;

public void setOnMeasureListener(OnMeasureListener onMeasureListener) {this.onMeasureListener = onMeasureListener;

}

public MyImageView(Context context, AttributeSet attrs) {super(context, attrs);

}

public MyImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);

}

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//将图片丈量的大年夜小回调到onMeasureSize()措施中if(onMeasureListener != null){

onMeasureListener.onMeasureSize(getMeasuredWidth(), getMeasuredHeight());}

}

public interface OnMeasureListener{public void onMeasureSize(int width, int height);

}

}

上面这些代码就完成了第一个界面的功能了,接下来便是点击GridView的item跳转另一个界面来显示该文件夹下面的所有图片,功能跟第一个界面差不多,也是应用GridView来显示图片,第二个界面的结构代码我就不贴了,直接贴上界面的代码

package com.example.imagescan;

import java.util.List;

import android.app.Activity;

import android.os.Bundle; import android.widget.GridView;

import android.widget.Toast;

public class ShowImageActivity extends Activity {private GridView mGridView;

private List list;private ChildAdapter adapter;

@Override

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.show_image_activity);

mGridView = (GridView) findViewById(R.id.child_grid);list = getIntent().getStringArrayListExtra("data");

adapter = new ChildAdapter(this, list, mGridView);

mGridView.setAdapter(adapter);

}

@Overridepublic void onBackPressed() {

Toast.makeText(this, "选中 " + adapter.getSelectItems().size() + " item", Toast.LENGTH_LONG).show();super.onBackPressed();

}

}

GridView的item上面一个我们自定义的MyImageView用来显示图片,别的还有一个CheckBox来记录我们选中环境,Adapter的代码如下

package com.example.imagescan;

import java.util.ArrayList;

import java.util.HashMap; import万博max官网手机版 java.util.Iterator;

import java.util.List; import java.util.Map;

import android.content.Context;

import android.graphics.Bitmap; import android.graphics.Point;

import android.view.LayoutInflater; import android.view.View;

import android.view.ViewGroup; import android.widget.BaseAdapter;

import android.widget.CheckBox; import android.widget.CompoundButton;

import android.widget.ImageView; import android.widget.CompoundButton.OnCheckedChangeListener;

import android.widget.GridView;

import com.example.imagescan.MyImageView.OnMeasureListener; import com.example.imagescan.NativeImageLoader.NativeImageCallBack;

import com.nineoldandroids.animation.AnimatorSet; import com.nineoldandroids.animation.ObjectAnimator;

public class ChildAdapter extends BaseAdapter {

private Point mPoint = new Point(0, 0);//用来封装ImageView的宽和高的工具/**

* 用来存储图片的选中环境*/

private HashMap mSelectMap = new HashMap();private GridView mGridView;

private List list;protected LayoutInflater mInflater;

public ChildAdapter(Context context, List list, GridView mGridView) {

this.list = list;this.mGridView = mGridView;

mInflater = LayoutInflater.from(context);}

@Override

public int getCount() {return list.size();

}

@Overridepublic Object getItem(int position) {

return list.get(position);}

@Overridepublic long getItemId(int position) {

return position;}

@Override

public View getView(final int position, View convertView, ViewGroup parent) {final ViewHolder viewHolder;

String path = list.get(position);

if(convertView == null){convertView = mInflater.inflate(R.layout.grid_child_item, null);

viewHolder = new ViewHolder();viewHolder.mImageView = (MyImageView) convertView.findViewById(R.id.child_image);

viewHolder.mCheckBox = (CheckBox) convertView.findViewById(R.id.child_checkbox);

//用来监听ImageView的宽和高viewHolder.mImageView.setOnMeasureListener(new OnMeasureListener() {

@Override

public void onMeasureSize(int width, int height) {mPoint.set(width, height);

}});

convertView.setTag(viewHolder);

}else{viewHolder = (ViewHolder) convertView.getTag();

viewHolder.mImageView.setImageResource(R.drawable.friends_sends_pictures_no);}

viewHolder.mImageView.setTag(path);viewHolder.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {//假如是未选中的CheckBox,则添加动画

if(!mSelectMap.containsKey(position) || !mSelectMap.get(position)){addAnimation(viewHolder.mCheckBox);

}mSelectMap.put(position, isChecked);

}});

viewHolder.mCheckBox.setChecked(mSelectMap.containsKey(position) ? mSelectMap.get(position) : false);

//使用Nat万博max官网手机版iveImageLoader类加载本舆图片

Bitmap bitmap = NativeImageLoader.getInstance().loadNativeImage(path, mPoint, new NativeImageCallBack() {

@Overridepublic void onImageLoader(Bitmap bitmap, String path) {

ImageView mImageView = (ImageView) mGridView.findViewWithTag(path);if(bitmap != null && mImageView != null){

mImageView.setImageBitmap(bitmap);}

}});

if(bitmap != null){

viewHolder.mImageView.setImageBitmap(bitmap);}else{

viewHolder.mImageView.setImageResource(R.drawable.friends_sends_pictures_no);}

return convertView;

}

/奸淫 给CheckBox加点击动画,使用开源库nineoldandroids设置动画

* @param view*/

private void addAnimation(View view){float [] vaules = new float[]{0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.25f, 1.2f, 1.15f, 1.1f, 1.0f};

AnimatorSet set = new AnimatorSet();set.playTogether(ObjectAnimator.ofFloat(view, "scaleX", vaules),

ObjectAnimator.ofFloat(view, "scaleY", vaules));set.setDuration(150);

set.start();}

/奸淫 获取选中的Item的position

* @return*/

public List getSelectItems(){List list = new ArrayList();

for(Iterator> it = mSelectMap.entrySet().iterator(); it.hasNext();){Map.Entry entry = it.next();

if(entry.getValue()){list.add(entry.getKey());

}}

return list;

}

public static class ViewHolder{

public MyImageView mImageView;public CheckBox mCheckBox;

}

}

第二个界面的Adapter跟第一个界面差不多,无非多了一个CheckBox用来记录图片选择环境,我们只必要对CheckBox设置setOnCheckedChangeListener监听,微信的选中之后CheckBox有一个动画效果,以是我使用nineoldandroids动画库也给CheckBox加了一个动画效果,直接调用addAnimation()措施就能添加了,getSelectItems()措施就能获取我们选中的item的position了,知道了选中的position,其他的信息就都知道了,微信有对图片进行预览的功能,我这里就不添加了,假如有这个需求可以自行添加,给大年夜家保举一个https://github.com/chrisbanes/PhotoView

运行项目,效果如下

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: