52周学52项技术之Android应用开发(第二部分):图片预览与分享功能实现

52周学52项技术之Android应用开发(第二部分):图片预览与分享功能实现

52-technologies-in-2016 Let's learn a new technology every week. A new technology blog every Sunday in 2016. 52-technologies-in-2016 项目地址: https://gitcode.com/gh_mirrors/52/52-technologies-in-2016

本文是"52周学52项技术"系列的第26篇,我们将继续完善第23周开始的Android应用开发。在第一部分中,我们实现了一个能够拍照、将照片存储到应用相册并在同一活动中预览的基本应用。本文将扩展以下功能:

  1. 创建专门用于图片预览的PreviewActivity
  2. 使用Glide库优化图片加载
  3. 为预览界面添加分享功能

开发准备

在开始之前,请确保已完成第一部分的学习内容。开发环境需要:

  1. JDK 6或更高版本
  2. 安装Android Studio开发环境
  3. 准备好第一部分的项目代码

功能一:创建图片预览Activity

1. 创建PreviewActivity

在Android开发中,Activity代表用户能执行的一个独立任务。我们将把图片预览功能从MainActivity中分离出来,创建一个专门的PreviewActivity。

在Android Studio中:

  1. 右键点击包名
  2. 选择New > Activity > Empty Activity
  3. 命名为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;
}

技术要点总结

  1. Activity分离原则:将不同功能分离到不同Activity中,提高代码可维护性
  2. Glide优势
    • 自动处理图片缩放和旋转
    • 内存缓存优化
    • 简洁的API设计
  3. 分享功能实现:使用Android系统提供的ShareActionProvider简化分享功能开发

通过本文的实现,我们构建了一个结构更清晰、功能更完善的Android应用。在后续开发中,可以考虑添加更多功能如:

  • 图片编辑功能
  • 多图浏览
  • 云存储集成等

希望本文能帮助你更好地理解Android开发中的关键概念和实践技巧。

52-technologies-in-2016 Let's learn a new technology every week. A new technology blog every Sunday in 2016. 52-technologies-in-2016 项目地址: https://gitcode.com/gh_mirrors/52/52-technologies-in-2016

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邱弛安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值