gpt4 book ai didi

android - ToggleButton Canvas 上绘制的文本和线条出现在屏幕上但不出现在屏幕截图上

转载 作者:行者123 更新时间:2023-11-30 00:56:45 24 4
gpt4 key购买 nike

我已经创建了一个 View MyToggleButton,它扩展了 ToogleButton。我覆盖了 Togglebutton 的 onDraw 方法以在按钮上画一条线并旋转它的文本。

这是MyToggleButton:

package com.example.gl.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
import android.widget.ToggleButton;

public class MyToggleButton extends ToggleButton {

public float textRotation=0;

public MyToggleButton(Context context, float rotationValue) {
super(context);

textRotation=rotationValue;
}

@Override
protected void onDraw(Canvas canvas){

TextPaint textPaint = getPaint();
textPaint.setColor(getCurrentTextColor());
textPaint.drawableState = getDrawableState();

canvas.save();

//paint
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setStrokeWidth(7);
paint.setStrokeCap(Paint.Cap.ROUND);

canvas.drawLine(canvas.getWidth() / 2, canvas.getHeight() / 2, (float) (canvas.getHeight() / 2 + 400), (canvas.getHeight() / 2), paint);

canvas.rotate(textRotation, canvas.getWidth() / 2, canvas.getHeight() / 2);

getLayout().draw(canvas);

canvas.restore();

}


}

之后,我想获取屏幕截图并查看它,为此我使用了 takeScreenshot() 方法,该方法通过按屏幕上的第三个按钮调用。截图代码根据How to programmatically take a screenshot in Android? . stackoverflow 上的其他帖子以及我在周围找到的各种站点和教程中都采用了相同的方法。

这是我使用的 MainActivity:

package com.example.gl.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

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

//add 3 buttons
addButtons();

}


private void addButtons(){

LinearLayout linear1= (LinearLayout) findViewById(R.id.vert1);

//MyToggleButton with rotated text
MyToggleButton btn1 = new MyToggleButton(this,0);
btn1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
btn1.setTextOff("Button 1 not rotated");
btn1.setTextOn("Button 1 not rotated");
btn1.setText("Button 1 not rotated");
linear1.addView(btn1);

//MyToggleButton with normal text
MyToggleButton btn2 = new MyToggleButton(this,50);
btn2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
btn2.setTextOff("Button 2 rotated");
btn2.setTextOn("Button 2 rotated");
btn2.setText("Button 2 rotated");
linear1.addView(btn2);

//button to create screenshot
Button btn3 = new Button(this);
btn3.setText("Create bitmap");
btn3.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
takeScreenshot();

}
});
linear1.addView(btn3);



}

//Screenshotcreator
private void takeScreenshot() {
try {
View v1 = getWindow().getDecorView().getRootView();

// create bitmap screen capture
v1.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());

v1.setDrawingCacheEnabled(false);

ImageView imageView1 =(ImageView) findViewById(R.id.imageView1);
imageView1.setImageBitmap(bitmap);


} catch (Throwable e) {
e.printStackTrace();
}
}


}

这是 MainActivity 的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.gl.myapplication.MainActivity"
android:id="@+id/relative1">

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vert1">

<ImageView
android:layout_width="wrap_content"
android:layout_height="250dp"
android:id="@+id/imageView1" />
</LinearLayout>
</RelativeLayout>

问题是虽然屏幕上一切看起来都正常,但屏幕截图的位图缺少绘制的线条和旋转的文本。

You can see the problem here. Screen is OK, screenshot is not.

位图中出现这种奇怪结果的原因可能是什么?

请注意,屏幕截图中缺少设备返回主页最近按钮,还有状态栏信息(时间等)。我怀疑这与我的问题有关。这些元素不属于我的应用程序,因此预计它们不会出现在我使用 v1 = getWindow().getDecorView().getRootView(); 获取的 View 中,但是 Canvas 在我绘制了旋转的文本,并且该线确实属于该 View 。

我的问题是:为什么绘制的线条和旋转的文本没有出现在屏幕截图上,我如何修改我的代码以获得同时显示它们的屏幕截图?

我不想做一些需要 root 设备的事情,而且我也不能使用 MediaProjection API,因为这是在 API 21 中添加的,但我希望我的应用程序也能在 android 4.4 (API 19) 上运行。最后,我知道存在外部库,例如 Android 屏幕截图库或这个:https://android-arsenal.com/details/1/2793 ,但我宁愿不使用任何外部库。

附言也许这是相关的:Surfaceview screenshot with line/ellipse drawn over it

最佳答案

问题是 btn1.isDrawingChaceEnabled()btn2.isDrawingChaceEnabled() 都返回 false

即使您在 RootView 上调用 setDrawingCacheEnabled(true),它也不会在他所有的 Children View 上递归设置为 true(我用 Log.d 测试过) .
这意味着您的 ToggleButton 的绘图缓存将为空,如 android.view.View.getDrawingCache() javadoc 中所述。

/**
* <p>Calling this method is equivalent to calling <code>getDrawingCache(false)</code>.</p>
*
* @return A non-scaled bitmap representing this view or null if cache is disabled.
*
* @see #getDrawingCache(boolean)
*/

因此请确保为您感兴趣的每个 View 设置 setDrawingCacheEnabled(true)
例如,我在您的代码中添加了以下几行:
在主 Activity 中

    btn1.setDrawingCacheEnabled(true);
btn2.setDrawingCacheEnabled(true);

And it looks like this

关于android - ToggleButton Canvas 上绘制的文本和线条出现在屏幕上但不出现在屏幕截图上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com