实践是知识的母亲,知识是生活的明灯。这篇文章主要讲述Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习相关的知识,希望能为你提供帮助。
文章图片
16.7挑战练习:优化照片显示新建dialog_photo.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <
?xml version="
1.0"
encoding="
utf-8"
?>
<
LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android"
android:orientation="
vertical"
android:layout_width="
match_parent"
android:layout_height="
match_parent"
>
<
ImageView android:id="
@+id/crime_photo_detail"
android:layout_width="
match_parent"
android:layout_height="
match_parent"
/>
<
/LinearLayout>
|
新建PhotoDetailFragment.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public classextends DialogFragment {
private static final String ARG_File = "
file"
;
private ImageView mPhotoView;
public static PhotoDetailFragment newInstance(File file) { Bundle args = new Bundle();
args.putSerializable(ARG_File, file);
PhotoDetailFragment fragment = new PhotoDetailFragment();
fragment.setArguments(args);
return fragment;
}
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { File file = (File) getArguments().getSerializable(ARG_File);
View v = LayoutInflater.from(getActivity()) .inflate(R.layout.dialog_photo, null);
mPhotoView = (ImageView) v.findViewById(R.id.crime_photo_detail);
Bitmap bitmap = PictureUtils.getScaledBitmap( file.getPath(), getActivity());
mPhotoView.setImageBitmap(bitmap);
return new AlertDialog.Builder(getActivity()) .setView(v)
.setPositiveButton(android.R.string.ok, null) .create();
} }
|
修改CrimeFragment.java
1 2
| private static final int REQUEST_PHOTO = 3;
private static final String DIALOG_PHOTO = "
DialogPhoto"
;
| onCreateView增加处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| mPhotoView = (ImageView) v.findViewById(R.id.crime_photo);
mPhotoView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mPhotoFile == null || !mPhotoFile.exists()) { mPhotoView.setImageDrawable(null);
} else {
FragmentManager manager = getFragmentManager();
PhotoDetailFragment dialog = PhotoDetailFragment.newInstance(mPhotoFile);
dialog.setTargetFragment(CrimeFragment.this, REQUEST_PHOTO);
dialog.show(manager, DIALOG_PHOTO);
}
} });
updatePhotoView();
|
演示结果:
文章图片
16.8 挑战练习:优化缩略图加载修改CrimeFragment.java
updatePhotoView,调用带宽高参数的getScaledBitmap1 2 3 4 5 6 7 8 9
| private void updatePhotoView(int width, int height) { if (mPhotoFile == null || !mPhotoFile.exists()) { mPhotoView.setImageDrawable(null);
} else { Bitmap bitmap = PictureUtils.getScaledBitmap( mPhotoFile.getPath(), width, height);
// change this one mPhotoView.setImageBitmap(bitmap);
} }
|
onCreateView加上1 2 3 4 5 6 7 8
| mPhotoObserver = mPhotoView.getViewTreeObserver();
mPhotoObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { updatePhotoView(mPhotoView.getWidth(), mPhotoView.getHeight());
} });
return v;
|
修改onActivityResult,不然返回拍完照片返回CrimeFragment的时候会显示不出略缩图1 2 3
| else if (requestCode == REQUEST_PHOTO) { updatePhotoView(mPhotoView.getWidth(), mPhotoView.getHeight());
}
|
上述代码运行无误,可以达到效果,虽然可以通过OnGlobalLayoutListener这个方式获取视图的宽和高,但是还没搞清楚,待日后补充吧
参考:点击打开链接
【Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习】Github具体代码:hyyyrwang.github.io
我的简书:https://www.jianshu.com/p/1b9785db93a6
推荐阅读
|