【Android】截图案例

58 阅读1分钟

1 工作空间

img

2 代码

​ MainActivity.java

package com.zhyan8.demo;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView tv;
    private ImageView iv;
    private Button btn_chat;
    private Button btn_capture;
    private LinearLayout layout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        tv = (TextView) findViewById(R.id.tv);
        iv = (ImageView) findViewById(R.id.iv);
        btn_chat = (Button) findViewById(R.id.btn_chat);
        btn_capture = (Button) findViewById(R.id.btn_capture);
        layout = (LinearLayout) findViewById(R.id.laout);
        btn_chat.setOnClickListener(cl);
        btn_capture.setOnClickListener(cl);
    }

    private View.OnClickListener cl = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.btn_chat) {
                int random = (int)(Math.random()*10)%10;
                String s = tv.getText().toString() + random;
                tv.setText(s);
            } else if (v.getId() == R.id.btn_capture) {
                layout.setDrawingCacheEnabled(true); //开启layout布局的视图缓存
                Bitmap bitmap = layout.getDrawingCache(); //从layout布局的绘图缓存中获取位图对象
                iv.setImageBitmap(bitmap); //给iv设置位图对象
                //在截图完毕后,不能马上关闭绘图缓存,因为画面渲染需要时间,如果立即关闭,渲染画面就找不到位图对象,所以要等界面渲染完毕后再关闭绘图缓存
                mHandler.postDelayed(mResetCache,200); //延迟关闭缓存
            }
        }
    };

    private Handler mHandler = new Handler(); //声明一个任务处理器

    private Runnable mResetCache = new Runnable() {
        @Override
        public void run() {
            layout.setDrawingCacheEnabled(false); //关闭layout布局的视图缓存
        }
    };
}

​ 注意:在截图完毕后,不能马上关闭绘图缓存,因为画面渲染需要时间,如果立即关闭,渲染画面就找不到位图对象,所以要等界面渲染完毕后再关闭绘图缓存,这里采取的方案是延时200ms执行关闭绘图缓存,为不阻塞主线程,在子线程中执行。

​ activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.zhyan8.demo.MainActivity">

    <LinearLayout
        android:id="@+id/laout"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:textSize="30sp"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center">
            <Button
                android:id="@+id/btn_chat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="30sp"
                android:text="输入"
                android:layout_margin="10dp"/>

            <Button
                android:id="@+id/btn_capture"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="30sp"
                android:text="截图"
                android:layout_margin="10dp"/>
        </LinearLayout>
    </LinearLayout>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="fitCenter"/>
</LinearLayout>

​ 界面如下:

img

3 效果展示

​ 连续点击若干次【输入】,如下:

img

​ 点击【截图】,如下:

img

​ 可以看到,在下面的 ImageView 视图里,显示了上面的截图。

​ 声明:本文转自【Android】截图案例