跟着老罗的视频做了这样一个安卓程序,却发现截取图片功能根本没有实现到,这是何故?其中也写了一些疑问在代码的注释中。。
MainActivity文件:
package com.example.imageviewdemo02; import android.support.v7.app.ActionBarActivity; import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Point; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; @SuppressLint("NewApi") public class MainActivity extends ActionBarActivity implements OnClickListener { private Button choseButton; private Button cutButton; private ImageView imageView; // 意图返回标志 private static final int CUT_BUTTON = 1; private static final int CHOSE_BUTTON = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); choseButton = (Button) findViewById(R.id.chose); cutButton = (Button) findViewById(R.id.cut); imageView = (ImageView) findViewById(R.id.imageView); choseButton.setOnClickListener(this); cutButton.setOnClickListener(this); } @Override public void onClick(View v) { // 判断是哪个Button switch (v.getId()) { case R.id.chose: { // action_pick是一个选择的动作意图,返回我们所选择的。第二个参数是图片库url,是打开的它 // 该intent返回的是所选择内容的路径,使用getData()方法获得该路径 Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, CHOSE_BUTTON); break; } case R.id.cut: { // 由于这个intent构建较长,所以弄个方法存放。 Intent intent = getImageClipIntent(); startActivityForResult(intent, CUT_BUTTON); break; } } } private Intent getImageClipIntent() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); //要裁剪就要设置图片的属性,大小 //设置获取的内容的类型为图片 intent.setType("image/*"); //放入extra数据设置可滑动截取图片 intent.putExtra("crop", "true"); //设置剪切的x,y轴的比例 intent.putExtra("aspectX", 1); //x方向 intent.putExtra("aspectY", 1); //y方向 //设置输出图片大小 intent.putExtra("outputX", 90); intent.putExtra("outputY", 90); //设置有返回值 intent.putExtra("return-data", true); return intent; } // 接受执行intent后返回的值并处理 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case CHOSE_BUTTON: { Uri uri = data.getData(); //获得图片路径 //获得手机屏幕的宽度和高度,存放于point中(其实屏幕的应用程序部分要比这个小因为有其他的部分占用了手机屏幕) Point point = new Point(); getWindowManager().getDefaultDisplay().getSize(point); //对图片进行适应屏幕的操作 try { //实例化图片裁剪类...这不是选择并返回图片吗?实例化它干嘛? BitmapFactory.Options factory = new BitmapFactory.Options(); //还是搞不清楚这个是拿来干嘛的。。。 factory.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, factory); //试验bitmap是否为空 结果不为空 //imageView.setImageBitmap(bitmap); // 问:为何getHeght()会出现空指针异常? //获取图片的尺寸并和屏幕的大小作比较 int height = factory.outHeight; int width = factory.outWidth; //做比较,若大于一这图片高或宽大于屏幕尺寸 int hRadio = (int) Math.ceil(height/(float)point.y); int wRadio = (int)Math.ceil(width/(float)point.x); if(hRadio>1||wRadio>1){ if(hRadio>wRadio){ //把图片的大小缩放为1/hRadio factory.inSampleSize = hRadio; }else{ factory.inSampleSize = wRadio; } } factory.inJustDecodeBounds = false; //为什么要二次调用这个?何用? 上面的那个bitmap是拿来干嘛的? Bitmap bitmap2 = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, factory); imageView.setImageBitmap(bitmap2); } catch (Exception e) { e.printStackTrace(); } break; } case CUT_BUTTON: { //搞不懂咯 。。。为什么选去图片反而比裁剪图片的代码要长那么多。。。。 Bitmap bitmap = data.getParcelableExtra("data"); imageView.setImageBitmap(bitmap); } } } } }
xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/chose" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择图片" /> <Button android:id="@+id/cut" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="裁剪图片" /> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
如果解决后,这篇文章就会放入已解决的困惑分类中。