Android长按图片保存至相册

这篇博客介绍了如何在React Native的Android应用中实现长按图片并将其保存到相册的功能。文章首先展示了应用的界面截图,接着详细讲解了图片加载的进度条View以及如何监听图片加载过程。作者使用AsyncTask加载图片,并在内存卡中保存,同时处理了Android 6.0及以上的运行时权限问题。最后,通过CameraRollManager类实现了长按保存图片至相册的功能,代码来源于React Native的Android模块。博客提供了相应的Git链接供读者下载示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:前面写了一篇reactnative的学习笔记,说reactnative的android框架中有很多福利,确实是的,也说到了我们app中的一个把图片保存到相册的功能,好吧,还是准备写一篇博客,就当笔记了~

先上几张app的图片:

一进app就是一个进度条加载图片(我待会也会说一下进度条view跟怎么监听图片加载过程):
这里写图片描述

图片加载完毕后:

这里写图片描述

长按图片进入相册可以看到我们保存的图片:

这里写图片描述

监听图片加载的loaddingview源码(不是很难,我就直接贴代码了):

package com.leo.camerroll;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.widget.ProgressBar;

/**
 * Created by leo on 17/1/22.
 */

public class LoadingView extends ProgressBar {
   
    private final int DEFAULT_RADIUS = dp2px(15);
    private final int DEFAULT_REACH_COLOR = 0XFFFFFFFF;
    private final int DEFAULT_UNREACH_COLOR = 0X88000000;
    private final long ANIM_DURATION = 1000;
    private final String BASE_TEXT = "00%";
    private boolean isStop;

    private int mRadius = DEFAULT_RADIUS;
    private int mStrokeWidth;
    private Paint reachPaint;
    private Paint unreachPaint;
    private Paint textPaint;
    private Paint bgPaint;

    private int mStartAngle=0;
    private float mSweepAngle=360*0.382f;

    private ValueAnimator anim;

    public LoadingView(Context context) {
        this(context, null);
    }

    public LoadingView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    private void initView() {
        reachPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        reachPaint.setStrokeCap(Paint.Cap.ROUND);
        reachPaint.setStyle(Paint.Style.STROKE);
        unreachPaint = new Paint(reachPaint);
        reachPaint.setColor(DEFAULT_REACH_COLOR);
        unreachPaint.setColor(DEFAULT_UNREACH_COLOR);
        textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        textPaint.setStyle(Paint.Style.STROKE);
        textPaint.setColor(Color.WHITE);
        textPaint.setFakeBoldText(true);

        bgPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);
        bgPaint.setStrokeCap(Paint.Cap.ROUND);
        bgPaint.setColor(Color.argb(44,0,0,0));
        setMax(100);
    }

    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int defWidth = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        int defHeight = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        int expectSize = Math.min(defHeight, defWidth);
        if (expectSize <= 0) {
            expectSize = mRadius * 2;
        } else {
            mRadius = expectSize / 2;
        }
        mStrokeWidth = mRadius / 5;
        reachPaint.setStrokeWidth(mStrokeWidth);
        unreachPaint.setStrokeWidth(mStrokeWidth);

        setMeasuredDimension(expectSize, expectSiz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值