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);
    }
}
Android 仿QQ图片选择器,包含图片裁剪,浏览大图功能。   博客地址:http://blog.csdn.net/junzia/article/details/53091606简单使用示例如需使用图片选择器功能,将chooser加入为依赖工程,然后使用指定功能:选择单张图片如果需要选择单张图片,调用:Intent intent=new Intent(IcFinal.ACTION_ALBUM); intent.putExtra(IcFinal.INTENT_MAX_IMG,1);   startActivityForResult(intent,1);裁剪如果需要选择单张图片并且裁剪,调用:Intent intent=new Intent(IcFinal.ACTION_ALBUM); intent.putExtra(IcFinal.INTENT_IS_CROP,true); startActivityForResult(intent,1);默认为圆形图片,大小为500*500。如果需要自行设定,给intent增加以下参数(目前功能未实现):intent.putExtra(IcFinal.INTENT_CROP_SHAPE,CropPath.SHAPE_RECT);   //矩形intent.putExtra(IcFinal.INTENT_CROP_WIDTH,512); //裁剪宽度intent.putExtra(IcFinal.INTENT_CROP_HEIGHT,280); //裁剪高度选择多张图片Intent intent=new Intent(IcFinal.ACTION_ALBUM); intent.putExtra(IcFinal.INTENT_MAX_IMG,9); startActivityForResult(intent,1);更多设置也许图片选择器默认的UI不符合你的要求,你可以选择利用ChooserSetting中的静态参数来更改图片选择器的效果:/**标题的背景颜色*/public static int TITLE_COLOR=0xFF584512;/**图片选择页,每行显示数*/public static int NUM_COLUMNS=3;/**图片加载失败的图片*/public static int errorResId=0;/**图片加载的占位图片*/public static int placeResId=R.mipmap.image_chooser_placeholder;/**图片加载的动画*/public static int loadAnimateResId=0;/**选中图片的滤镜颜色*/public static int chooseFilter=0x55000000;/**未被选中的图片的滤镜颜色*/public static int unChooseFilter=0;/**最新的图片集合显示名字*/public static String newestAlbumName="最新图片";/**最新图片集合的最大数量*/public static int newestAlbumSize=100;public static int albumPopupHeight=600;public static String tantoToast="";/**照片选择指示器*/public static IChooseDrawable chooseDrawable=new CircleChooseDrawable(true,0xFF25c2e6);如果这些也无法满足你的UI要求,你也可以参照EntryActivity重新写相册的入口Activity,参照CropActivity重写裁剪的入口Activity。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值