android仿QQ图片选择

编程入门 行业动态 更新时间:2024-10-17 14:18:49

android仿QQ<a href=https://www.elefans.com/category/jswz/34/1770705.html style=图片选择"/>

android仿QQ图片选择

之前写过一个“邮箱”,邮箱发件的时候要选择图片,需求说要跟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() {@Overridepublic 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);//原图CheckBoxtv_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的Viewthis.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() {@Overridepublic void onDismiss() {// TODO Auto-generated method stubbackgroundAlpha(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() {@Overridepublic 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() {@Overridepublic 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;}@Overridepublic 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);}
}

更多推荐

android仿QQ图片选择

本文发布于:2024-02-06 12:16:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749153.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图片   android   QQ

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!