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() {
            @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);
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值