Android选取相机、相册图片进行裁剪,并更新UI

demo源码:http://download.csdn.net/detail/u010778159/8648701

效果图:
技术分享
技术分享

界面非常的简单,只有一个imageView,通过点击该ImageView,从相册中选取照片,或拍照,将得到的照片按要求进行裁剪,然后将裁剪后的照片更新到ImageView中。

现在,来看一下工程的xml,和.java文件:
技术分享
技术分享

  1. 有两个xml文件,main.xml是进入app时的主页面,有一个ImageView
  2. select_pic_layout.xml是点击ImageView之后弹出来的框,一共有3个button,从中可以选择是从相机中获取图片还是相册中获取图片

来看下详细代码:
main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#F3F1DA"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/title_bg"
        android:gravity="center"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/title_bar_txt"
            android:textColor="@android:color/white" />
    </LinearLayout>

    <!-- image switch -->
    <RelativeLayout
        android:id="@+id/switch_face_rl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"

        android:background="@drawable/item_edit_bg"
        android:clickable="true"
        android:padding="5dip" >

        <ImageView
            android:id="@+id/face"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:layout_alignParentLeft="true"
            android:scaleType="centerCrop"  
            android:src="@drawable/mini_avatar" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="5dip"
            android:layout_marginTop="5dip"
            android:layout_toRightOf="@id/face"
            android:text="设置头像"
            android:textColor="@android:color/black" />
    </RelativeLayout>
</LinearLayout>

select_pic_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/dialog_layout"
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        android:layout_alignParentBottom="true"
        android:background="@drawable/sf_takephoto_bg"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_take_photo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="20dip"
            android:background="@drawable/btn_style_alert_dialog_button"
            android:text="拍照"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_pick_photo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="5dip"
            android:background="@drawable/btn_style_alert_dialog_button"
            android:text="从相册选择"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dip"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="15dip"
            android:background="@drawable/btn_style_alert_dialog_cancel"
            android:text="取消"
            android:textColor="#ffffff"
            android:textStyle="bold" />
    </LinearLayout>

</RelativeLayout>

MainActivity.java:


import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * 
 * @author Liuzhipeng ([email protected]) Create at 2015-4-30 上午11:14:31
 */
public class MainActivity extends Activity implements
        android.view.View.OnClickListener {

    private ImageView faceImage;

    /* 请求码 */
    private static final int REQUEST_PHOTO = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题
        setContentView(R.layout.main);

        faceImage = (ImageView) findViewById(R.id.face);
        // 设置事件监听
        faceImage.setOnClickListener(this);

    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch (arg0.getId()) {
        case R.id.face:
            Intent intent = new Intent(this, SelectPicActivity.class);
            startActivityForResult(intent, REQUEST_PHOTO);
            break;
        default:
            break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        if(resultCode==Activity.RESULT_OK){

        switch (requestCode) {
        case REQUEST_PHOTO:
            Log.e("PhotoClip", "aaaaaaaaaa");
            if (data != null) {
                byte[] bis = data.getByteArrayExtra("bitmap");
                Bitmap bm = BitmapFactory.decodeByteArray(bis, 0, bis.length);

                faceImage.setImageBitmap(bm);
            }
        default:
            break;
        }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

}

SelectPicActivity.java:


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
 * @author 刘志鹏<br>
 *         Email :[email protected]<br>
 *         QQ: 316910444<br>
 * @version 创建时间? 2015-4-30 上午11:33:03
 */

public class SelectPicActivity extends Activity implements OnClickListener {

    /***
     * 使用照相机拍照获取图??
     */
    public static final int SELECT_PIC_BY_TACK_PHOTO = 1;
    /***
     * 使用相册中的图片
     */
    public static final int SELECT_PIC_BY_PICK_PHOTO = 2;

    private LinearLayout dialogLayout;
    private Button takePhotoBtn, pickPhotoBtn, cancelBtn;

    // MainActivity中跳转到SelectPicActivity的Intent
    private Intent lastIntent;

    private static final int PHOTO_REQUEST = 1;
    private static final int CAMERA_REQUEST = 2;
    private static final int PHOTO_CLIP = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_pic_layout);
        initView();
    }

    /**
     * 初始化加载View
     */
    private void initView() {
        dialogLayout = (LinearLayout) findViewById(R.id.dialog_layout);
        dialogLayout.setOnClickListener(this);
        takePhotoBtn = (Button) findViewById(R.id.btn_take_photo);
        takePhotoBtn.setOnClickListener(this);
        pickPhotoBtn = (Button) findViewById(R.id.btn_pick_photo);
        pickPhotoBtn.setOnClickListener(this);
        cancelBtn = (Button) findViewById(R.id.btn_cancel);
        cancelBtn.setOnClickListener(this);
        // 得到在MainActivity中的Intent
        lastIntent = getIntent();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.dialog_layout:
            finish();
            break;
        case R.id.btn_take_photo:
            // 调用摄像头
            getPicFromCamera();
            break;
        case R.id.btn_pick_photo:
            // 从相册中获取图片
            getPicFromPhoto();
            break;
        default:
            finish();
            break;
        }
    }

    private void getPicFromPhoto() {
        Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                "image/*");
        startActivityForResult(intent, PHOTO_REQUEST);
    }

    private void getPicFromCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 下面这句指定调用相机拍照后的照片存储的路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
                Environment.getExternalStorageDirectory(), "test.jpg")));
        startActivityForResult(intent, CAMERA_REQUEST);
    }

    // 点击空白处,finish掉,退回到MainActivity
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        finish();
        return super.onTouchEvent(event);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case CAMERA_REQUEST:
            switch (resultCode) {
            case -1:// -1表示拍照成功
                // 得到刚刚拍照的照片
                File file = new File(Environment.getExternalStorageDirectory()
                        + "/test.jpg");
                if (file.exists()) {
                    // 对图片进行裁剪,传入该文件的Uri
                    photoClip(Uri.fromFile(file));
                }
                break;
            default:
                break;
            }
            break;
        case PHOTO_REQUEST:
            if (data != null) {
                photoClip(data.getData());
            }
            break;

        case PHOTO_CLIP:
            // 图片裁剪完之后
            if (data != null) {
                Bundle extras = data.getExtras();
                if (extras != null) {
                    Bitmap photo = extras.getParcelable("data");

                    //将Bitmap转换为Byte[]通过Bundle传到MainActivity
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    //对图片进行压缩,第二个参数为压缩的百分比,100为不压缩
                    photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                    byte[] bitmapByte = baos.toByteArray();
                    lastIntent.putExtra("bitmap", bitmapByte);
                    //跳回到MainActivity,调用OnActivityResult()
                    setResult(Activity.RESULT_OK, lastIntent);
                    finish();

                    // faceImage.setImageBitmap(photo);
                }
            }
            break;
        default:
            break;
        }

    }

    private void photoClip(Uri uri) {
        // 调用系统中自带的图片剪裁
        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", 7);
        intent.putExtra("aspectY", 4);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 315);
        intent.putExtra("outputY", 180);
        // 如果为true,会返回bitmap,通过data.getExtras().getParcelable("data");获取
        intent.putExtra("return-data", true);
        startActivityForResult(intent, PHOTO_CLIP);
    }
}

基本上注释都写得很清楚了,还有一伙的话,大家可以下载demo运行一下。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。