52周学52项技术之Android应用开发(第二部分):图片预览与分享功能实现
本文是"52周学52项技术"系列的第26篇,我们将继续完善第23周开始的Android应用开发。在第一部分中,我们实现了一个能够拍照、将照片存储到应用相册并在同一活动中预览的基本应用。本文将扩展以下功能:
- 创建专门用于图片预览的
PreviewActivity
- 使用Glide库优化图片加载
- 为预览界面添加分享功能
开发准备
在开始之前,请确保已完成第一部分的学习内容。开发环境需要:
- JDK 6或更高版本
- 安装Android Studio开发环境
- 准备好第一部分的项目代码
功能一:创建图片预览Activity
1. 创建PreviewActivity
在Android开发中,Activity代表用户能执行的一个独立任务。我们将把图片预览功能从MainActivity中分离出来,创建一个专门的PreviewActivity。
在Android Studio中:
- 右键点击包名
- 选择New > Activity > Empty Activity
- 命名为PreviewActivity并完成创建
2. 重构MainActivity
修改MainActivity的onActivityResult
方法,使其在拍照成功后启动PreviewActivity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
addPicToGallery();
Intent previewIntent = new Intent(this, PreviewActivity.class);
previewIntent.putExtra(PreviewActivity.CAPTURED_PHOTO_PATH, capturedPhotoPath);
startActivity(previewIntent);
}
}
3. 实现PreviewActivity功能
将图片显示相关代码从MainActivity迁移到PreviewActivity:
public class PreviewActivity extends AppCompatActivity {
public static final String CAPTURED_PHOTO_PATH = "capturedPhotoPath";
private String capturedPhotoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preview);
Intent intent = getIntent();
this.capturedPhotoPath = intent.getStringExtra(CAPTURED_PHOTO_PATH);
setPic();
}
private void setPic() {
// 图片显示实现
}
}
4. 设计预览界面
创建activity_preview.xml
布局文件,包含一个ImageView用于显示图片:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
...>
<LinearLayout
...>
<TextView
android:text="Preview"
... />
<ImageView
android:id="@+id/image_preview"
... />
</LinearLayout>
</RelativeLayout>
功能二:使用Glide优化图片加载
1. 添加Glide依赖
在build.gradle中添加依赖:
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}
2. 重构图片加载代码
使用Glide简化图片加载逻辑:
private void setPic() {
ImageView previewView = (ImageView) findViewById(R.id.image_preview);
File file = new File(capturedPhotoPath);
Glide.with(this)
.load(file)
.into(previewView);
}
3. 添加错误处理
增强健壮性,添加错误处理和占位图:
Glide.with(this)
.load(file)
.error(R.drawable.kid) // 加载失败时显示的图片
.listener(new RequestListener<File, GlideDrawable>() {
@Override
public boolean onException(Exception e, File model,
Target<GlideDrawable> target, boolean isFirstResource) {
Log.e(TAG, "图片加载异常", e);
return false;
}
// 其他回调方法
})
.into(previewView);
功能三:实现图片分享
1. 创建分享菜单
在res/menu目录下创建preview_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_share_photo"
android:title="分享"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="ifRoom" />
</menu>
2. 实现分享功能
在PreviewActivity中设置分享意图:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.preview_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_share_photo);
ShareActionProvider shareProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(shareItem);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(capturedPhotoPath)));
shareProvider.setShareIntent(shareIntent);
return true;
}
技术要点总结
- Activity分离原则:将不同功能分离到不同Activity中,提高代码可维护性
- Glide优势:
- 自动处理图片缩放和旋转
- 内存缓存优化
- 简洁的API设计
- 分享功能实现:使用Android系统提供的ShareActionProvider简化分享功能开发
通过本文的实现,我们构建了一个结构更清晰、功能更完善的Android应用。在后续开发中,可以考虑添加更多功能如:
- 图片编辑功能
- 多图浏览
- 云存储集成等
希望本文能帮助你更好地理解Android开发中的关键概念和实践技巧。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考