1package com.android.test.hwui;
2
3import android.app.Activity;
4import android.graphics.Bitmap;
5import android.graphics.Bitmap.Config;
6import android.graphics.Paint.Style;
7import android.graphics.Canvas;
8import android.graphics.Color;
9import android.graphics.ColorFilter;
10import android.graphics.Paint;
11import android.graphics.PixelFormat;
12import android.graphics.Rect;
13import android.graphics.drawable.Drawable;
14import android.os.Bundle;
15import android.os.Handler;
16import android.util.Log;
17import android.view.PixelCopy;
18import android.view.View;
19import android.widget.Button;
20import android.widget.ImageView;
21import android.widget.LinearLayout;
22import android.widget.TextView;
23
24public class PixelCopyWindow extends Activity {
25
26    private Handler mHandler;
27    private ImageView mImage;
28    private TextView mText;
29
30    @Override
31    protected void onCreate(Bundle savedInstanceState) {
32        super.onCreate(savedInstanceState);
33        mHandler = new Handler();
34
35        LinearLayout layout = new LinearLayout(this);
36        TextView text = new TextView(this);
37        text.setText("Hello, World!");
38        Button btn = new Button(this);
39        btn.setText("Screenshot!");
40        btn.setOnClickListener((v) -> takeScreenshot());
41        mImage = new ImageView(this);
42        mText = new TextView(this);
43
44        layout.setOrientation(LinearLayout.VERTICAL);
45        layout.addView(text);
46        layout.addView(btn);
47        layout.addView(mImage);
48        layout.addView(mText);
49        final float density = getResources().getDisplayMetrics().density;
50        layout.setBackground(new Drawable() {
51            Paint mPaint = new Paint();
52
53            @Override
54            public void draw(Canvas canvas) {
55                mPaint.setStyle(Style.STROKE);
56                mPaint.setStrokeWidth(4 * density);
57                mPaint.setColor(Color.BLUE);
58                final Rect bounds = getBounds();
59                canvas.drawRect(bounds, mPaint);
60                mPaint.setColor(Color.RED);
61                canvas.drawLine(bounds.centerX(), 0, bounds.centerX(), bounds.height(), mPaint);
62                mPaint.setColor(Color.GREEN);
63                canvas.drawLine(0, bounds.centerY(), bounds.width(), bounds.centerY(), mPaint);
64            }
65
66            @Override
67            public void setAlpha(int alpha) {
68            }
69
70            @Override
71            public void setColorFilter(ColorFilter colorFilter) {
72            }
73
74            @Override
75            public int getOpacity() {
76                return PixelFormat.TRANSLUCENT;
77            }
78        });
79        setContentView(layout);
80    }
81
82    private void takeScreenshot() {
83        View decor = getWindow().getDecorView();
84        Rect srcRect = new Rect();
85        decor.getGlobalVisibleRect(srcRect);
86        final Bitmap bitmap = Bitmap.createBitmap(
87                (int) (srcRect.width() * .25), (int) (srcRect.height() * .25), Config.ARGB_8888);
88        PixelCopy.request(getWindow(), srcRect, bitmap, (result) -> {
89            if (result != PixelCopy.SUCCESS) {
90                mText.setText("Copy failed, result: " + result);
91                mImage.setImageBitmap(null);
92            } else {
93                mText.setText("");
94                mImage.setImageBitmap(bitmap);
95            }
96        }, mHandler);
97    }
98}
99