Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习

实践是知识的母亲,知识是生活的明灯。这篇文章主要讲述Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习相关的知识,希望能为你提供帮助。

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();

演示结果:


Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习

文章图片


16.8 挑战练习:优化缩略图加载修改CrimeFragment.java
updatePhotoView,调用带宽高参数的getScaledBitmap
1
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

    推荐阅读