小工具知识网

当前位置: 首页 > 行业知识 > Android 截图功能实现

行业知识

Android 截图功能实现

2026-11-09 17:14:43 来源:互联网转载

Android 截图功能实现

  • 简介
  • 效果图
  • 功能实现
    • 1. 截取当前可见范围屏幕
    • 2. 截取当前可见范围屏幕(不包含状态栏)
    • 3. 截取某个控件
    • 4. 截取ScrollView
    • 5. 长截图
    • 6. 截屏动画效果
    • 7. 显示截屏结果,自动消失
    • 6. 完整代码

      简介

      在Android应用中开发截图功能涉及到以下几个步骤:获取屏幕内容、处理截图、保存截图等。

      效果图

      功能实现

      1. 截取当前可见范围屏幕

      /** * 截取当前可见范围屏幕 */private void screenCapture() {//        View decorView = getWindow().getDecorView();//        decorView.setDrawingCacheEnabled(true);// 清空缓存,可用于实时截图//        decorView.buildDrawingCache();//        Bitmap screenBitmap = Bitmap.createBitmap(decorView.getDrawingCache());//        decorView.setDrawingCacheEnabled(false); // 清空缓存,可用于实时截图    View decorView = getWindow().getDecorView();    Bitmap screenBitmap = Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Bitmap.Config.ARGB_8888);    Canvas canvas = new Canvas(screenBitmap);    decorView.draw(canvas);    updateImageCapture(screenBitmap);}

      2. 截取当前可见范围屏幕(不包含状态栏)

      /** * 截取当前可见范围屏幕(不包含状态栏) */private void screenCaptureNoStatusBar() {    View view = getWindow().getDecorView();    view.setDrawingCacheEnabled(true);    view.buildDrawingCache();    // 获取状态栏高度    Rect rect = new Rect();    view.getWindowVisibleDisplayFrame(rect);    int statusBarH = rect.top;    // 获取屏幕宽高    int w = view.getWidth();    int h = view.getHeight();    // 去掉状态栏    Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarH, w, h - statusBarH);    // 销毁缓存信息    view.destroyDrawingCache();    updateImageCapture(bitmap);}

      3. 截取某个控件

      /** * 截取某个控件 * @param view */private void screenCapture(View view) {    Bitmap screenBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);    Canvas canvas = new Canvas(screenBitmap);    view.draw(canvas);    updateImageCapture(screenBitmap);}

      4. 截取ScrollView

      /** * 截取ScrollView * @param view */private void screenCapture(ScrollView view) {    int h = 0;    for (int i = 0; i  

      5. 长截图

      /** * 滚屏截长图 */private Runnable scrollRunnable = new Runnable() {    @SuppressLint("NewApi")    @Override    public void run() {        boolean isToBottom = isScrollToEnd();        if (isToBottom) {            Log.i(TAG, "run: to bottom");            Thread.currentThread().interrupt();            mHandler.removeCallbacks(scrollRunnable);            screenCapture(scrollView);        } else {            // 未滑动到底部            int off = linearLayout.getMeasuredHeight() - scrollView.getHeight(); // 判断高度            if (off > 0) {                scrollView.scrollBy(0, 6);                if (scrollView.getScaleY() >= off) {                    Thread.currentThread().interrupt();                    mHandler.removeCallbacks(scrollRunnable);                } else {                    mHandler.postDelayed(this, 10);                }            }        }    }};

      6. 截屏动画效果

      截屏时有一个缩放的动画效果,缩放到右上角。

      1. 动画效果文件,/res/anim/scale_animation.xml文件。
              
      1. 代码中使用动画效果
      mCardView.startAnimation(animation);

      7. 显示截屏结果,自动消失

      截屏完成,会将截取的图片显示在界面中,显示截屏3s后会自动消失。

      /** * 显示截图3s后自动消失 */private Runnable captureViewRunnable = new Runnable() {    @SuppressLint("NewApi")    @Override    public void run() {        mCardView.clearAnimation();        mCardView.setVisibility(View.INVISIBLE);    }};

      6. 完整代码

      1. 布局文件:activity_screenshot.xml。
                                              
      1. Activity文件:ScreenshotActivity.java。
      public class ScreenshotActivity extends AppCompatActivity {    private static final String TAG = "ScreenshotActivity";    private ScrollView scrollView;    private LinearLayout linearLayout;    private ImageView ivScreenshots;    private CardView mCardView;    private Handler mHandler = new Handler();    // 截图动画    private Animation animation;    // 截图显示的时间,超时后消失    private static final int CAPTURE_SHOW_TIMEOUT = 3000;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_screenshot);        scrollView = findViewById(R.id.scroll_view);        linearLayout = findViewById(R.id.linear_layout);        ivScreenshots = findViewById(R.id.iv_capture);        mCardView = findViewById(R.id.cardView);        Button btnScreenshots = findViewById(R.id.btn_screenshot);        Button btnLong = findViewById(R.id.bnt_long);        animation = AnimationUtils.loadAnimation(this, R.anim.scale_animation);        animation.setFillAfter(true);        // 动态添加textview        for (int i = 0; i  0) {                    scrollView.scrollBy(0, 6);                    if (scrollView.getScaleY() >= off) {                        Thread.currentThread().interrupt();                        mHandler.removeCallbacks(scrollRunnable);                    } else {                        mHandler.postDelayed(this, 10);                    }                }            }        }    };    /**     * 显示截图3s后自动消失     */    private Runnable captureViewRunnable = new Runnable() {        @SuppressLint("NewApi")        @Override        public void run() {            mCardView.clearAnimation();            mCardView.setVisibility(View.INVISIBLE);        }    };    /**     * 截取当前可见范围屏幕     */    private void screenCapture() {//        View decorView = getWindow().getDecorView();//        decorView.setDrawingCacheEnabled(true);// 清空缓存,可用于实时截图//        decorView.buildDrawingCache();//        Bitmap screenBitmap = Bitmap.createBitmap(decorView.getDrawingCache());//        decorView.setDrawingCacheEnabled(false); // 清空缓存,可用于实时截图        View decorView = getWindow().getDecorView();        Bitmap screenBitmap = Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(screenBitmap);        decorView.draw(canvas);        updateImageCapture(screenBitmap);    }    /**     * 截取某个控件     * @param view     */    private void screenCapture(View view) {        Bitmap screenBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(screenBitmap);        view.draw(canvas);        updateImageCapture(screenBitmap);    }    /**     * 截取ScrollView     * @param view     */    private void screenCapture(ScrollView view) {        int h = 0;        for (int i = 0; i = lastChildBottom) {            // scrollTo 和 scrollTo 不是同时回调,所以添加两个逻辑都可(可根据需要决定是否需要使用两个逻辑组合)            // 已滑动到底部            return true;        } else {            return false;        }    }}
      1. 截图动画文件:scale_animation.xml。
              

上一篇:怎么增加云服务器的内存?

下一篇:Ping程序深度解析,探究源码与理解网络工具工作原理