一个选择照片的基类

/** * Created by pc on 2016/5/10. * 选择照片的基类 */public class photoActivity extends BaseActivity implements View.OnClickListener {

    private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照    private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择    private static final int PHOTO_REQUEST_CUT = 3;// 结果    private File tempFile;    private String saveBmpToSd_path;    /**     * 截屏比例     */    private int  scale = 1;

    /**     * 储存图片路径     */    private HashMap<String,String> pathMap = new HashMap<>();    private ImageView  iv_photo;    private String  mapKey;

    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);

        initDialog();    }

    private Dialog dialog;    private void initDialog(){        dialog = new Dialog(this, R.style.dialog);        dialog.setContentView(R.layout.dialog_layout);        Window dialogWindow = dialog.getWindow();        dialog.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog消失        dialogWindow.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);        WindowManager.LayoutParams lp = dialogWindow.getAttributes();        dialogWindow.setGravity(Gravity.BOTTOM);        dialogWindow.setWindowAnimations(R.style.dialogWindowAnim); // 设置窗口弹出动画        TextView tv_photo = (TextView) dialog.findViewById(R.id.tv_photo);        tv_photo.setOnClickListener(this);        TextView  tv_camera = (TextView) dialog.findViewById(R.id.tv_camera);        tv_camera.setOnClickListener(this);        TextView  tv_close = (TextView) dialog.findViewById(R.id.tv_close);        tv_close.setOnClickListener(this);

        String DIR =    Environment.getExternalStorageDirectory()+"/DCIM/Camera";        File dirPath = new File(DIR);        if (!dirPath.exists()) {            dirPath.mkdirs();        }//        String name = getPhotoFileName();//        photoPath =  DIR+"/"+name;

        tempFile = new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera",getPhotoFileName());    }

    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.tv_photo:                intent = new Intent(Intent.ACTION_PICK, null);                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");                startActivityForResult(intent, PHOTO_REQUEST_GALLERY);                dialog.dismiss();                break;            case R.id.tv_camera:                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 打开相机                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));                startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);///mnt/sdcard/DCIM//IMG_20151127_143744.jpg                dialog.dismiss();                break;            case R.id.tv_close:                dialog.dismiss();                break;

            default:                break;        }    }

    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        Log.e("onActivityResult==>", "" + "running");        switch (requestCode) {            case PHOTO_REQUEST_TAKEPHOTO:                startPhotoZoom(Uri.fromFile(tempFile), 150);                break;

            case PHOTO_REQUEST_GALLERY:                if (data != null)                    startPhotoZoom(data.getData(), 150);                break;            case PHOTO_REQUEST_CUT:                if (data != null)                    setPicToView(data);                break;            default:                break;        }    }

    private void startPhotoZoom(Uri uri, int size) {        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri, "image/*");        // crop为true是设置在开启的intent中设置显示的view可以剪裁        intent.putExtra("crop", "true");

        // aspectX aspectY 是宽高的比例        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", scale);

        intent.putExtra("noFaceDetection", true);// 取消人脸识别(直接把截取框放到脸部)        // outputX,outputY 是剪裁图片的宽高        intent.putExtra("outputX", size);        intent.putExtra("outputY", size);        intent.putExtra("return-data", true);        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT        startActivityForResult(intent, PHOTO_REQUEST_CUT);    }

    //将进行剪裁后的图片显示到UI界面上    private void setPicToView(Intent picdata) {        Bundle bundle = picdata.getExtras();        if (bundle != null) {            Bitmap photo = bundle.getParcelable("data");            if(photo == null){                String url = bundle.getString("croppedpath");                if(ImageHelper.Exist(url)){                    photo = ImageHelper.getimage(url, 100);                }

            }            if(photo != null){

//                imgs[index].setImageBitmap(photo);//                tvphotos[index].setVisibility(View.GONE);

                //压缩图片                Bitmap sbitmap = ImageHelper.compressImage(photo, 50);//          Bitmap sbitmap = BitmapUtil.comp(photo);                iv_photo.setImageBitmap(sbitmap);//          //保存图片                String filename = getPhotoFileName();                saveBmpToSd_path = ImageHelper.saveBmpToSd(sbitmap, filename , 100);                if(ImageHelper.Exist(saveBmpToSd_path)){                    pathMap.put(mapKey, saveBmpToSd_path);                    photo.recycle();                    photo = null ;//                    sbitmap.recycle();//                    sbitmap = null ;                }            }else {                ShowToase.showToast(this, "图片截取异常");            }        }    }

    // 使用系统当前日期加以调整作为照片的名称    private String getPhotoFileName() {        Date date = new Date(System.currentTimeMillis());        SimpleDateFormat dateFormat = new SimpleDateFormat("‘IMG‘_yyyyMMdd_HHmmss");        return dateFormat.format(date) + ".jpg";    }

    /**     * 上传是调用     * @return     */  protected  HashMap<String,String> getMap(){    return    pathMap ;  };

    /**     * 显示     * @param img     * @param key 服务端要求的key字段     */    protected  void   showDialog(ImageView img ,String  key){        iv_photo= img;        mapKey= key;        dialog.show();;    }

}
<!--普通dialog--><style name="dialog">    <item name="android:windowFrame">@null</item>    <!--Dialog的windowFrame框为无 -->    <item name="android:windowIsFloating">true</item>    <!--是否浮现在activity之上 -->    <item name="android:windowIsTranslucent">true</item>    <!-- 是否半透明 -->    <item name="android:windowNoTitle">true</item>    <item name="android:backgroundDimEnabled">true</item>    <item name="android:windowBackground">@android:color/transparent</item></style>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/layout_root"    android:layout_width="match_parent"    android:layout_height="match_parent"   >

    <LinearLayout        android:id="@+id/ll_dialog"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        android:gravity="center"        android:background="@color/blue">        <TextView            android:id="@+id/tv_photo"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:text="相册"            android:textColor="@color/white"            android:padding="15dip"            android:gravity="center"/>        <View            android:layout_width="fill_parent"            android:layout_height="0.5dip"            android:background="#c2c2c2"/>        <TextView            android:id="@+id/tv_camera"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:text="拍照"            android:textColor="@color/white"            android:padding="15dip"            android:gravity="center"/>        <View            android:layout_width="fill_parent"            android:layout_height="0.5dip"            android:background="#c2c2c2"/>        <TextView            android:id="@+id/tv_close"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:text="取消"            android:textColor="@color/white"            android:padding="15dip"            android:gravity="center"/>    </LinearLayout>

</RelativeLayout>
				
时间: 2024-10-16 15:14:31

一个选择照片的基类的相关文章

《Programming WPF》翻译 第9章 2.选择一个基类

原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类,并且说明了他们之间的继承关系.注意到,这决不是完整的继承关系图,只是简单的显示了一些你应该考虑的可能的基类. 无论你选择了哪一个基类,你的元素都会直接或间接地从FrameworkElement派生.这将提供routing事件,高级属性处理,动画,数据绑定,外观上的支持,样式,以及逻辑树的集成. 派生于Fram

空基类优化empty base class optimization

1.为什么C++中不允许类的大小是0 class ZeroSizeT {}; ZeroSizeT z[10]; &z[i] - &z[j]; 一般是用两个地址之间的字节数除以类型大小而得到的,而类型大小是0将会出问题 2.为什么有时多个类组成实例所占空间都是一样的 class Empty { }; class EmptyToo : public Empty { }; class EmptyThree : public EmptyToo { }; sizeof(Empty) : 1 size

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

winfrom 基类窗体与子类窗体load事件详解

今日在写代码时,需要在子窗体运行时调用基类窗体中的load事件,顺带将该部分功能做一个详细的了解. Winform窗体在初始化到呈现在用户眼前会依次经历三个阶段,构造-加载-显示,分别对应.NET 窗体中的 InitializeComponent,onLoad,show三个调用函数,以下: InitializeComponent:初始化窗体及窗体上的控件,加载并分配资源,注册相关事件 onLoad:注册装载窗口事件,是窗体启动时调用该函数,触发formload事件,从而调用From_Load事件

【c++】虚基类

何要使用虚基类: 为何避免多层继承中出项多个公共基类所造成的歧义现象 虚基类用法 派生类继承基类时,加上一个virtual关键词则为虚拟基类继承. 在上图程序运行中,我们发现class bass的构造函数只调用了一次,因此obj.a就不会产生二义性了. 问题1: 在这我们要特别留意下obj.a的结果123,为何它不是122也不是124,偏偏是123呢? 构造函数调用的顺序: 从结果可以看出,从最底层派生类grand开始查找,我们发现grand先调用虚基类derive_v的构造函数:对derive

编写高质量代码改善C#程序的157个建议——建议23:避免将List&lt;T&gt;作为自定义集合类的基类

建议23:避免将List<T>作为自定义集合类的基类 如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口.FCL结合类应该以组合的形式包含至自定义的集合类,需要扩展的泛型接口通常是IEnumerable<T>和ICollection<T>(或ICollection<T>的子接口,如IList<T>),前者规范了集合类的迭代功能,后者规范了一个集合通常会有的操作. 一般的情况下,下面两个实现的集合类都能完成默认的

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取

Duilib学习笔记《06》— 窗体基类WindowImpBase

在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等…所以,能不能创建一个公有的窗体基类呢?其实,在duilib中已经提供了一个窗体基类 WindowImplBase:在基类内搭建窗口的消息框架,各处理函数为虚函数,子类可以重载处理函数,实现其处理. 此处我们以修改之前的代码为例来进行说明. 1. 窗体显示 CMainWndDlg类修改为继承Windo

C++ Primer 学习笔记_65_面向对象编程 -概述、定义基类跟派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)