之前写过一个“邮箱”,邮箱发件的时候要选择图片,需求说要跟QQ的选择图片的样式一样,没有需求图让我自行参考。
本想直接在网上找demo,但觉得还是自己写的放心些。在这大概说一下完成思路,其中做了一些图片的压缩处理防止OOM
按照惯例,先上效果图:
图1:点击工具栏“图片选择”,弹出可滑动横向图片列表
这里关于工具栏就不说了,很简单。
主要说一下可滑动横向图片列表,我选择的是PopupWindow上嵌套横向的GridView来实现:
/**
* Created by housifan on 2018/7/3.
* 嵌套GridView 用于图片选择
*/
public class ImagePopupWindow extends PopupWindow implements View.OnClickListener{
private Activity context;
private GridView mGridView;
private int size,photoBytes = 0;
private MyGridAdapter adapter;
private CheckBox yuantu_checkbox;
private TextView tv_photo_ok,tv_photo_type;
public OnClickGridItemListen onClickGridItemListen;
private boolean checkStatus = false;
public ImagePopupWindow(Activity context,MyGridAdapter adapter,int size) {
this.context = context;
this.adapter = adapter;
this.size = size;
initPopuwindom(adapter,size);
adapter.setOnClickSelectPhotoListen(new MyGridAdapter.OnClickSelectPhotoListen() {
@Override
public void onClickPhotoSelect(ArrayList<String> selectPhotoPath) {
photoBytes = 0;
if(selectPhotoPath.size() > 0){
tv_photo_ok.setText("完成("+selectPhotoPath.size()+")");
for (int i = 0; i < selectPhotoPath.size(); i++) {
File file2 = new File(selectPhotoPath.get(i));
photoBytes += (int) (file2.length() / 1024); //1024bytes=1KB , 1024KB=1MB.
}
if(photoBytes >= 1024){
BigDecimal bd = new BigDecimal(String.valueOf((float)photoBytes/1024));
tv_photo_type.setText("(共"+ bd.setScale(2, BigDecimal.ROUND_HALF_UP) +"M)");//取两位小数
}else{
tv_photo_type.setText("(共"+photoBytes+"K)");
}
if(yuantu_checkbox.isChecked()){
tv_photo_type.setVisibility(View.VISIBLE);
}
}else{
tv_photo_type.setVisibility(View.GONE);
tv_photo_ok.setText("完成");
}
}
});
}
private void initPopuwindom(MyGridAdapter adapter,int size){
View view = context.getLayoutInflater().inflate(R.layout.image_popu, null, false);
mGridView = (GridView) view.findViewById(R.id.grid);
TextView tv_photo_scan = (TextView) view.findViewById(R.id.tv_photo_scan);//相册
yuantu_checkbox = (CheckBox) view.findViewById(R.id.yuantu_checkbox);//原图CheckBox
tv_photo_type = (TextView) view.findViewById(R.id.tv_photo_type);//原图大小
tv_photo_ok = (TextView) view.findViewById(R.id.tv_photo_ok);//完成
TextView tv_photo_cancle = (TextView) view.findViewById(R.id.tv_photo_cancle);//取消
int h = context.getWindowManager().getDefaultDisplay().getHeight();
int w = context.getWindowManager().getDefaultDisplay().getWidth();
// 设置SelectPicPopupWindow的View
this.setContentView(view);
// 设置SelectPicPopupWindow弹出窗体的宽
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
// 设置SelectPicPopupWindow弹出窗体的高
this.setHeight(h/2 + 50);
// 设置SelectPicPopupWindow弹出窗体可点击
this.setFocusable(true);
this.setOutsideTouchable(true);
// 刷新状态
this.update();
// 实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0000000000);
// 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
this.setBackgroundDrawable(dw);
backgroundAlpha(context,0.5f);//0.0-1.0
// 设置SelectPicPopupWindow弹出窗体动画效果
this.setAnimationStyle(R.style.PopupAnimation);
this.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
// TODO Auto-generated method stub
backgroundAlpha(context,1f);//0.0-1.0
}
});
tv_photo_scan.setOnClickListener(this);
tv_photo_cancle.setOnClickListener(this);
tv_photo_ok.setOnClickListener(this);
yuantu_checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
checkStatus = true;
tv_photo_type.setVisibility(View.VISIBLE);
}else{
checkStatus = false;
tv_photo_type.setVisibility(View.GONE);
}
}
});
setGridView(adapter,size);
}
public void showImgePopuwindom(View parent){
if (!this.isShowing()) {
//this.showAtLocation(parent,Gravity.CENTER_HORIZONTAL, 0,0);
this.showAtLocation(parent,Gravity.BOTTOM, 0,0);
} else {
this.dismiss();
}
}
/**设置GirdView参数,绑定数据*/
private void setGridView(final MyGridAdapter adapter, int size) {
int length = 150;
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
float density = dm.density;
int gridViewWidth = (int) (size * (length + 5) * density);
int itemWidth = (int) (length * density);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(gridViewWidth, ViewGroup.LayoutParams.MATCH_PARENT);
mGridView.setLayoutParams(params); // 设置GirdView布局参数,横向布局的关键
mGridView.setColumnWidth(itemWidth); // 设置列表项宽
mGridView.setHorizontalSpacing(5); // 设置列表项水平间距
mGridView.setStretchMode(GridView.NO_STRETCH);
mGridView.setNumColumns(size); // 设置列数量=列表集合数
mGridView.setAdapter(adapter);
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(MyGridAdapter.getCheckStatus().get(position)){
MyGridAdapter.getCheckStatus().put(position,false);
}else{
MyGridAdapter.getCheckStatus().put(position,true);
}
adapter.notifyDataSetChanged();
}
});
}
public void setOnClickGridItemListen(OnClickGridItemListen onClickGridItemListen){
this.onClickGridItemListen = onClickGridItemListen;
}
@Override
public void onClick(View v) {
switch (v.getId()){
//相册
case R.id.tv_photo_scan:
context.startActivity(new Intent(context,AlbumActivity.class));//跳转到相册
this.dismiss();
break;
//完成
case R.id.tv_photo_ok:
onClickGridItemListen.onClickSelectOk(adapter.getSelectPath(),checkStatus);
break;
case R.id.tv_photo_cancle:
this.dismiss();
break;
}
}
public interface OnClickGridItemListen{
void onClickSelectOk(ArrayList<String> selectPositionList,boolean checkStatus);
}
/**
* 设置添加屏幕的背景透明度
*/
public void backgroundAlpha(Activity context, float bgAlpha) {
WindowManager.LayoutParams lp = context.getWindow().getAttributes();
lp.alpha = bgAlpha;
context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
context.getWindow().setAttributes(lp);
}
}