android仿微信图片上传进度,android高仿微信发布动态(选择图片)

【实例简介】Android 超高仿微信图片选择器

【实例截图】

9f522cbbd3b89e0528c00422aa053288.png

【核心代码】

public class MainActivity extends Activity implements OnImageDirSelected

{

private ProgressDialog mProgressDialog;

/**

* 存储文件夹中的图片数量

*/

private int mPicsSize;

/**

* 图片数量最多的文件夹

*/

private File mImgDir;

/**

* 所有的图片

*/

private List mImgs;

private GridView mGirdView;

private MyAdapter mAdapter;

/**

* 临时的辅助类,用于防止同一个文件夹的多次扫描

*/

private HashSet mDirPaths = new HashSet();

/**

* 扫描拿到所有的图片文件夹

*/

private List mImageFloders = new ArrayList();

private RelativeLayout mBottomLy;

private TextView mChooseDir;

private TextView mImageCount;

int totalCount = 0;

private int mScreenHeight;

private ListImageDirPopupWindow mListImageDirPopupWindow;

private Handler mHandler = new Handler()

{

public void handleMessage(android.os.Message msg)

{

mProgressDialog.dismiss();

// 为View绑定数据

data2View();

// 初始化展示文件夹的popupWindw

initListDirPopupWindw();

}

};

/**

* 为View绑定数据

*/

private void data2View()

{

if (mImgDir == null)

{

Toast.makeText(getApplicationContext(), "擦,一张图片没扫描到",

Toast.LENGTH_SHORT).show();

return;

}

mImgs = Arrays.asList(mImgDir.list());

/**

* 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;

*/

mAdapter = new MyAdapter(getApplicationContext(), mImgs,

R.layout.grid_item, mImgDir.getAbsolutePath());

mGirdView.setAdapter(mAdapter);

mImageCount.setText(totalCount "张");

};

/**

* 初始化展示文件夹的popupWindw

*/

private void initListDirPopupWindw()

{

mListImageDirPopupWindow = new ListImageDirPopupWindow(

LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 0.7),

mImageFloders, LayoutInflater.from(getApplicationContext())

.inflate(R.layout.list_dir, null));

mListImageDirPopupWindow.setOnDismissListener(new OnDismissListener()

{

@Override

public void onDismiss()

{

// 设置背景颜色变暗

WindowManager.LayoutParams lp = getWindow().getAttributes();

lp.alpha = 1.0f;

getWindow().setAttributes(lp);

}

});

// 设置选择文件夹的回调

mListImageDirPopupWindow.setOnImageDirSelected(this);

}

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

DisplayMetrics outMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(outMetrics);

mScreenHeight = outMetrics.heightPixels;

initView();

getImages();

initEvent();

}

/**

* 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹

*/

private void getImages()

{

if (!Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED))

{

Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();

return;

}

// 显示进度条

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

new Thread(new Runnable()

{

@Override

public void run()

{

String firstImage = null;

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);

Log.e("TAG", mCursor.getCount() "");

while (mCursor.moveToNext())

{

// 获取图片的路径

String path = mCursor.getString(mCursor

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

Log.e("TAG", path);

// 拿到第一张图片的路径

if (firstImage == null)

firstImage = path;

// 获取该图片的父路径名

File parentFile = new File(path).getParentFile();

if (parentFile == null)

continue;

String dirPath = parentFile.getAbsolutePath();

ImageFloder imageFloder = null;

// 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~)

if (mDirPaths.contains(dirPath))

{

continue;

} else

{

mDirPaths.add(dirPath);

// 初始化imageFloder

imageFloder = new ImageFloder();

imageFloder.setDir(dirPath);

imageFloder.setFirstImagePath(path);

}

int picSize = parentFile.list(new FilenameFilter()

{

@Override

public boolean accept(File dir, String filename)

{

if (filename.endsWith(".jpg")

|| filename.endsWith(".png")

|| filename.endsWith(".jpeg"))

return true;

return false;

}

}).length;

totalCount = picSize;

imageFloder.setCount(picSize);

mImageFloders.add(imageFloder);

if (picSize > mPicsSize)

{

mPicsSize = picSize;

mImgDir = parentFile;

}

}

mCursor.close();

// 扫描完成,辅助的HashSet也就可以释放内存了

mDirPaths = null;

// 通知Handler扫描图片完成

mHandler.sendEmptyMessage(0x110);

}

}).start();

}

/**

* 初始化View

*/

private void initView()

{

mGirdView = (GridView) findViewById(R.id.id_gridView);

mChooseDir = (TextView) findViewById(R.id.id_choose_dir);

mImageCount = (TextView) findViewById(R.id.id_total_count);

mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly);

}

private void initEvent()

{

/**

* 为底部的布局设置点击事件,弹出popupWindow

*/

mBottomLy.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

mListImageDirPopupWindow

.setAnimationStyle(R.style.anim_popup_dir);

mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0);

// 设置背景颜色变暗

WindowManager.LayoutParams lp = getWindow().getAttributes();

lp.alpha = .3f;

getWindow().setAttributes(lp);

}

});

}

@Override

public void selected(ImageFloder floder)

{

mImgDir = new File(floder.getDir());

mImgs = Arrays.asList(mImgDir.list(new FilenameFilter()

{

@Override

public boolean accept(File dir, String filename)

{

if (filename.endsWith(".jpg") || filename.endsWith(".png")

|| filename.endsWith(".jpeg"))

return true;

return false;

}

}));

/**

* 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;

*/

mAdapter = new MyAdapter(getApplicationContext(), mImgs,

R.layout.grid_item, mImgDir.getAbsolutePath());

mGirdView.setAdapter(mAdapter);

// mAdapter.notifyDataSetChanged();

mImageCount.setText(floder.getCount() "张");

mChooseDir.setText(floder.getName());

mListImageDirPopupWindow.dismiss();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值