相关疑难解决方法(0)

在View上启用HW加速,在矩形覆盖中打孔

我有一个视图,它做了一些基本的绘图.在此之后,我想绘制一个打孔的矩形,这样只能看到上一个图形的一个区域.我想为我的视图启用硬件加速以获得最佳性能.

目前我有两种方法可以工作,但只有在禁用硬件加速时才有效,而另一种方法太慢.

方法1:SW加速(慢)

final int saveCount = canvas.save();

// Clip out a circle.
circle.reset();
circle.addCircle(cx, cy, radius, Path.Direction.CW);
circle.close();
canvas.clipPath(circle, Region.Op.DIFFERENCE);

// Draw the rectangle color.
canvas.drawColor(backColor);

canvas.restoreToCount(saveCount);
Run Code Online (Sandbox Code Playgroud)

这不适用于为视图启用的硬件加速,因为在此模式下不支持'canvas.clipPath'(我知道我可以强制SW渲染,但我想避免这种情况).

方法2:硬件加速(V.慢速)

// Create a new canvas.
final Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(b);

// Draw the rectangle colour.
c.drawColor(backColor);

// Erase a circle.
c.drawCircle(cx, cy, radius, eraser);

// Draw the bitmap on our views  canvas.
canvas.drawBitmap(b, 0, 0, null);
Run Code Online (Sandbox Code Playgroud)

橡皮擦创建的地方

eraser = new Paint()
eraser.setColor(0xFFFFFFFF); …
Run Code Online (Sandbox Code Playgroud)

graphics android drawing hardware-acceleration porter-duff

35
推荐指数
1
解决办法
9906
查看次数

在画布上绘图 - PorterDuff.Mode.CLEAR绘制黑色!为什么?

我正在尝试创建一个简单的自定义视图:有一个由弧路径显示的位图 - 从0deg到360deg.学位正在随着一些FPS而变化.

所以我使用重写onDraw()方法创建了一个自定义视图:

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
    canvas.drawArc(arcRectF, -90, currentAngleSweep, true, arcPaint);
    arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, circleSourceRect, circleDestRect, arcPaint);
}
Run Code Online (Sandbox Code Playgroud)

arcPaint 初始化如下:

arcPaint = new Paint();
arcPaint.setAntiAlias(true);
arcPaint.setColor(Color.RED); // Color doesn't matter
Run Code Online (Sandbox Code Playgroud)

现在,一切都很棒,但是...整个视图中的背景是黑色的.

如果我设置canvas.drawColor(..., PorterDuff.Mode.DST)并省略canvas.drawBitmap()- 在透明背景上正确绘制圆弧.

我的问题是 - 如何设置PorterDuff模式以使其与透明度一起工作?

当然bitmap是具有alpha通道的32位PNG.

android drawing canvas porter-duff

21
推荐指数
2
解决办法
2万
查看次数

Android动画 - 随着背景转换放大和淡化

我想做这样的事情.有人能指出我正确的方向吗?

在此输入图像描述

现在,我正在使用Scale Animation和FadeOut Animation.看起来像这样..

在此输入图像描述

我如何为此添加背景颜色..另外请记住,我希望这可以从ICS/Jellybean工作

我的代码到现在为止......

fade_out_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:duration="100" />
</set>
Run Code Online (Sandbox Code Playgroud)

scale_up_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:duration="100"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1"
        android:toYScale="1" />
</set>
Run Code Online (Sandbox Code Playgroud)

activity_main.xml - 只是相关部分

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center">

            <TextView
                android:id="@+id/textView4"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_centerInParent="true"
                android:layout_margin="8dp"
                android:background="@drawable/shape_circle"
                android:gravity="center"
                android:text="004"
                android:textColor="@color/light_gray"
                android:textSize="18sp" />

            <View
                android:id="@+id/outer_view"
                android:layout_width="120dp"
                android:layout_height="120dp"
                android:layout_centerInParent="true"
                android:visibility="invisible"
                android:background="@drawable/shape_circle_yellow"/>


      </RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

shape_circle.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="false" android:state_pressed="false" android:state_selected="false">
        <shape android:shape="oval">

            <solid android:color="@color/ash" />  <!-- Fill color -->

            <stroke android:width="4dp" android:color="@color/medium_gray" …
Run Code Online (Sandbox Code Playgroud)

android android-animation

11
推荐指数
1
解决办法
2632
查看次数

Android Compose:在图像上绘制透明圆圈

我有一个图像,我想在它上面绘制一个带有透明圆圈的深色矩形,所以结果将是这样的: https://www.google.com/url?sa=i&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F36763696%2Fhow-to-create-a-transparent-circle-inside-rectangle-shape-in​​- xml-in-android&psig=AOvVaw18ZjvY-j8QyYzFw1xsmOdJ&ust=1630768957499000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCPD1mveN4_ICFQAAAAAdAAAAABAE

我最终得到了这段代码:

Box(modifier = Modifier
        .clip(RectangleShape)
        .fillMaxSize()
        .background(Color.Black)
        .pointerInput(Unit) {
            detectTransformGestures { centroid, pan, zoom, rotation ->
                scale *= zoom
            }
        }) {
        Image(
            modifier = Modifier
                .align(Alignment.Center)
                .graphicsLayer(
                    scaleX = maxOf(.2f, minOf(5f, scale)),
                    scaleY = maxOf(.2f, minOf(5f, scale))
                ),
            bitmap = bitmap.asImageBitmap(),
            contentDescription = null
        )
        Canvas(modifier = Modifier.fillMaxSize(), onDraw = {
            drawRect(Color.Black.copy(alpha = 0.8f))
            drawCircle(
                Color.Transparent,
                style = Fill,
                blendMode = BlendMode.Clear
            )
        })
    }
Run Code Online (Sandbox Code Playgroud)

但它似乎只是在图像顶部画了一个黑圆圈,而不是清除变暗的矩形......

如果您建议如何根据此圆坐标裁剪图像,这也会非常方便。

android android-jetpack-compose

9
推荐指数
1
解决办法
5396
查看次数

Canvas Eraser正在画一条黑线

我搜索了这个问题并提出了各种解决方案.
但是,没有一个对我有用.

我在应用程序中有一个绘图画布.
画布的背景设置为活动中的png图像,该图像使用自定义视图(drawView);

Bundle extras = intent.getExtras();
    if (extras != null) {
        if (extras.containsKey("background")) {

            //set the background to the resource in the extras
            int imageResource = intent.getIntExtra("background",-1);
            Drawable image = getResources().getDrawable(imageResource);
            drawView.setBackground(image);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在DrawingView类(drawview是实例)中,我存储了PathPaints集合中绘制的路径,它具有3个属性(路径,使用的绘制以及是否为橡皮擦);

private ArrayList<PathPaint> paths = new ArrayList<PathPaint>();
Run Code Online (Sandbox Code Playgroud)

然后我尝试在OnDraw中循环遍历这些路径,并每次使用它们绘制的颜料(多种颜色)重绘它们;

protected void onDraw(Canvas canvas) {

    //if the drawing is new - dont draw any paths
    if (isNew != true) {

        //go through every previous path and draw them
        for (PathPaint p : paths) {

            if (!p.isErase) …
Run Code Online (Sandbox Code Playgroud)

android android-canvas eraser

7
推荐指数
1
解决办法
1382
查看次数

在填充的Android画布上绘制一个透明圆圈

在此输入图像描述

我想做一些非常简单的事情(见上文).我希望画布的所有像素都是纯色,但填充中心圆的像素除外.我已经阅读了关于这个主题的数百个堆栈溢出帖子,并尝试了数百种事情,包括设置PorterDuff.Mode.这是我当前onDraw()的MyView扩展视图:

  protected void onDraw(Canvas canvas) {
    int w = canvas.getWidth();
    int h = canvas.getHeight();

    Paint framePaint = new Paint();
    framePaint.setStyle(Paint.Style.FILL);
    framePaint.setColor(Color.BLUE);
    canvas.drawRect(0, 0, w, h, framePaint);

    Paint transparentPaint = new Paint();
    transparentPaint.setColor(Color.TRANSPARENT);
    transparentPaint.setAntiAlias(true);
    canvas.drawCircle(w / 2, h / 2, (w + h) / 4, transparentPaint);
  }
Run Code Online (Sandbox Code Playgroud)

我误解了什么,为什么我不能用透明涂料涂在现有的像素上.当我这样做时,像素保持不变.当我使用PorterDuff时,像素变黑.请帮忙.

android transparent porter-duff android-canvas

4
推荐指数
1
解决办法
6724
查看次数