Android 截屏并保存至相册

效果演示如下,因为大小限制,gif比较短

这里写图片描述

截屏后的动画模仿了Android系统自带截屏的动画
计算好坐标,就可以截取自己所需区域
主类源码如下:

package sbingo.com.screenshotplus;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import sbingo.com.screenshotplus.tools.Constant;
import sbingo.com.screenshotplus.tools.ToastUtils;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * 保存
     */
    private TextView mSave;
    /**
     * 裁剪区域
     */
    private LinearLayout mSaveArea;
    /**
     * 顶部裁剪坐标
     */
    private int mCutTop;
    /**
     * 左侧裁剪坐标
     */
    private int mCutLeft;
    /**
     * 截图成功后显示的控件
     */
    private ImageView mPicGet;
    private FrameLayout mFL;
    /**
     * 绘图区高度
     */
    private int mPicGetHeight;
    /**
     * 绘图区宽度
     */
    private int mPicGetWidth;
    /**
     * 最后的截图
     */
    private Bitmap saveBitmap;
    private FrameLayout mTotal;
    /**
     * 待裁剪区域的绝对坐标
     */
    private int[] mSavePositions = new int[2];
    /**
     * 成功动画handler
     */
    private SuccessHandler successHandler;
    /**
     * 恢复初始化handler
     */
    private InitHandler initHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {

        mSave = (TextView) findViewById(R.id.tv_save);
        mSaveArea = (LinearLayout) findViewById(R.id.ll_save_area);
        mPicGet = (ImageView) findViewById(R.id.iv_pic_get);
        mFL = (FrameLayout) findViewById(R.id.fl_pic);
        mTotal = (FrameLayout) findViewById(R.id.fl_total);

        mSave.setOnClickListener(this);

        successHandler = new SuccessHandler();
        initHandler = new InitHandler();
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        if (hasFocus) {
            mSaveArea.getLocationOnScreen(mSavePositions);
            mCutLeft = mSavePositions[0];
            mCutTop = mSavePositions[1];
            mPicGetHeight = mTotal.getHeight();
            mPicGetWidth = mTotal.getWidth();
        }
    }

    @Override
    public void onClick(View v) {
        mSave.setText("存储中……");
        mSave.setEnabled(false);
        new Thread(new Runnable() {
            @Override
            public void run() {
                screenshot();
            }
        }).start();
    }

    private void screenshot() {
        // 获取屏幕
        View dView = getWindow().getDecorView();
        dView.setDrawingCacheEnabled(true);
        dView.buildDrawingCache();
        Bitmap bmp = dView.getDrawingCache();
        if (bmp != null) {
            try {
                //二次截图
                saveBitmap = Bitmap.createBitmap(mSaveArea.getWidth(), mSaveArea.getHeight(), Bitmap.Config.ARGB_8888);
                Canvas canvas = new Canvas(saveBitmap);
                Paint paint = new Paint();
                canvas.drawBitmap(bmp, new Rect(mCutLeft, mCutTop, mCutLeft + mSaveArea.getWidth(), mCutTop + mSaveArea.getHeight()),
                        new Rect(0, 0, mSaveArea.getWidth(), mSaveArea.getHeight()), paint);

                File imageDir = new File(Constant.IMAGE_DIR);
                if (!imageDir.exists()) {
                    imageDir.mkdir();
                }
                String imageName = Constant.SCREEN_SHOT;
                File file = new File(imageDir, imageName);
                try {
                    if (file.exists()) {
                        file.delete();
                    }
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                FileOutputStream os = new FileOutputStream(file);
                saveBitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
                os.flush();
                os.close();

                //将截图保存至相册并广播通知系统刷新
                MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), imageName, null);
                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file));
                sendBroadcast(intent);

                successHandler.sendMessage(Message.obtain());

            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            initHandler.sendMessage(Message.obtain());
        }

    }

    /**
     * 成功动画handler
     */
    private class SuccessHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            showSuccess();
        }
    }
    /**
     * 恢复初始化handler
     */
    private class InitHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            ToastUtils.show(MainActivity.this, "存储失败");
            mSave.setEnabled(true);
            mSave.setText("存储到相册");
        }
    }

    /**
     * 截图成功后显示动画
     */
    private void showSuccess() {
        ToastUtils.show(MainActivity.this, "保存成功");
        mPicGet.setImageBitmap(saveBitmap);
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(1f, 0.7f);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                ViewGroup.LayoutParams lp = mPicGet.getLayoutParams();
                lp.height = (int) (mPicGetHeight * (float) animation.getAnimatedValue());
                lp.width = (int) (mPicGetWidth * (float) animation.getAnimatedValue());
                mPicGet.setLayoutParams(lp);
            }
        });
        valueAnimator.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationStart(Animator animation) {
                mFL.setVisibility(View.VISIBLE);
                mPicGet.setVisibility(View.VISIBLE);
                ViewGroup.LayoutParams lp = mPicGet.getLayoutParams();
                lp.height = mPicGetHeight;
                lp.width = mPicGetWidth;
                mPicGet.setLayoutParams(lp);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mPicGet.setVisibility(View.GONE);
                        mFL.setVisibility(View.GONE);
                        mSave.setEnabled(true);
                        mSave.setText("存储到相册");
                    }
                }, 1500);
            }
        });
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.setDuration(800);
        valueAnimator.start();
    }

}


完整源码请参看我的github

走,看源码去!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现Python全页面保存为PDF,可以使用Python的selenium库和pyPdf库来实现。 首先,需要安装selenium库和pyPdf库。可以使用pip来进行安装: ``` pip install selenium pyPdf ``` 接下来,我们需要下载并安装Chromedriver。Chromedriver是用于控制Chrome浏览器的一个工具。可以通过以下链接下载Chromedriver: https://sites.google.com/a/chromium.org/chromedriver/downloads 下载完成后,将下载的Chromedriver解压,并将其路径添加到系统环境变量中。 接下来是编写代码。以下是一个示例代码: ```python from selenium import webdriver from pyPdf import PdfWriter import time # 创建Chrome浏览器驱动 driver = webdriver.Chrome() # 打开网页 driver.get('https://www.example.com') # 等待页面完全加载 time.sleep(5) # 获取页面高度 height = driver.execute_script("return document.documentElement.scrollHeight") # 创建一个空的PDF文件 output_pdf = PdfWriter() # 设置图的宽度和高度 driver.set_window_size(1920, height) # 循环滚动页面并 for i in range(0, height, 1080): # 滚动页面 driver.execute_script(f"window.scrollTo(0, {i})") time.sleep(1) # 保存为临时文件 driver.save_screenshot('/tmp/temp.png') # 将图片添加到PDF文件中 output_pdf.add_page('/tmp/temp.png') # 保存PDF文件 output_pdf.write('screenshot.pdf') # 关闭浏览器 driver.quit() ``` 代码中,我们首先创建了一个Chrome浏览器驱动。然后打开指定的网页,并等待页面完全加载。接着获取页面的高度,并创建一个空的PDF文件。然后设置图的宽度和高度,并循环滚动页面,并在每一次滚动时进行,将图片添加到PDF文件中。最后保存PDF文件并关闭浏览器。 请确保在实际运行代码之前,将以下行代码中的网页链接和文件保存路径修改为你所需的地址: ```python driver.get('https://www.example.com') driver.save_screenshot('/tmp/temp.png') output_pdf.write('screenshot.pdf') ``` 希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值