标签: android-canvas

setDither,setFilterBitmap和setAntiAlias在Canvas中做了什么?

通常我看到的样本,在尝试在画布上绘制位图时使用此方法.例如:

paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
Run Code Online (Sandbox Code Playgroud)

但我不知道这三种方法是做什么的?当我必须使用它们时?

android bitmap android-canvas

12
推荐指数
1
解决办法
1万
查看次数

Android 旋转文本:我使用 dynamiclayout.draw(canvas) 但它不沿路径设置动画,并且不能使用 canvas.drawTextOnPath(dynamiclayout)

我正在使用我自己的https://github.com/mdg-iitr/RotatingText版本来显示旋转文本小部件。此 GitHub 中提供了一个视频,可让您观看动画。这个想法是设置单词行。行是一行接一行地显示的。整行都在旋转(它的话也是如此)。当前一行的旋转动画结束时,会在前一行之后显示一行。

我的问题

我使用 aDynamicLayout来显示文本行。请记住:行必须旋转。

我的问题是:显然,我不能使用该方法canvas.drawTextOnPath(dynamicLayoutObject)。所以,我做的是:dynamicLayoutObjec.draw(canvas);。但那时没有任何动画。事实上,文本(所以DynamicLayout包含它)必须旋转。

预期结果

DynamicLayout(事实上,它的文本)必须动画(旋转)。旋转可以在这个 SO 问题(https://github.com/mdg-iitr/RotatingText)开头给出的 Github 原始存储库的插图中找到。

我的问题

我不知道如何让我的DynamicLayout(和/或其文本)沿着我的路径旋转。

最小且可测试的示例

我大约在 8 个月前修改了原始 RotatingText 库。为了简化它(更少的类,更少的方法,没有未使用的方法等)。事实上,我只有两个类:

  1. RotatingTextSwitcher,这是 XML 小部件

  2. And Rotatable,其中包含要旋转的字符串数组。

  3. 包含 XML 小部件的 .XML 布局RotatingTextSwitcher以对其进行测试

  4. AFragment膨胀前面提到的布局,设置每个旋转行的单词,并显示它们。

为了测试它,创建一个显示下面给出的片段的活动,它反过来使用上面提供的其他来源。

可旋转类

import android.graphics.Path;
import android.view.animation.Interpolator;

public class Rotatable {

    private final String[] text;
    private final int update_duration;
    private int animation_duration;
    private Path path_in, path_out;
    private …
Run Code Online (Sandbox Code Playgroud)

android android-widget android-layout android-canvas android-view

12
推荐指数
1
解决办法
586
查看次数

Android drawCircle具有不同的颜色边框

是否可以使用一种drawCircle方法在Android的画布上绘制一个具有不同颜色边框的圆圈?

我注意到了FILL_AND_STROKE的PaintStyle,但是填充和边框似乎都没有不同的颜色.

我真的不想要调用两个drawCircle方法.

android android-canvas

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

Android在画布中创建图层

我想学习如何在我的Android应用程序中创建图层(如在photoshop中).我想实现一个基本的东西:当我在画布中添加一个图像时,例如,我想要能够绘制画布,但画面不能影响图形的线条.然后我需要将该图像保存在我的SD卡上.

有什么建议/意见/例子吗?我可以用什么来实现这个目标?

android paint layer android-canvas

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

Canvas.clipPath上的Android UnsupportedOperationException

我在我的项目中使用来自https://github.com/lvillani/android-cropimage的图像裁剪库来裁剪存储在设备上的图像.

但是,某些用户使用以下堆栈跟踪报告崩溃

java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:413)
at com.android.camera.HighlightView.draw(HighlightView.java:101)
at com.android.camera.CropImageView.onDraw(CropImage.java:783)
at android.view.View.draw(View.java:11006)
at android.view.View.getDisplayList(View.java:10445)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.draw(View.java:11009)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2154)
at android.view.View.getDisplayList(View.java:10445)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:853)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1961)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1679)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2558)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4697)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

从搜索我认为它只是由某些设备上的硬件加速引起的.我在清单中禁用了硬件加速,但异常仍在发生.我还发现"一个可靠的解决方法是识别代码中有问题的操作,将其绘制到位图中,然后将位图blit到加速画布."

根据堆栈跟踪的有问题的代码是

protected …
Run Code Online (Sandbox Code Playgroud)

android exception android-canvas

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

lockCanvas()返回不同的画布

尝试在单个画布上绘制每个ms的内容.我的意思是只向画布添加细节,而不是每一帧都重绘它.所以这段代码给了我三个不同的画布.第三,然后再次.为什么?

public void run() {
    this.run = true;
    Canvas canvas = null;
    while (run) {
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (this.surfaceHolder) {
                Thread.sleep(delay);
                draw(new Img(canvas, size));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
            this.surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
        synchronized (this) {
            if (wait) {
                try {
                    wait();
                } catch (Exception e) {}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它是android三重缓冲 - 如何关闭它,或用它做一些事情?Android 4.2.1

java android android-canvas

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

使用画布在Arc内绘制文本

我正在一个Android应用程序中绘制一个圆圈并将它们平均分开并将文本绑定在圆圈中的分割部分内(如pichart).我画了一个圆圈并将它们平分,但我想将文本绑定在分割部分内.请查看我的代码并提供解决方案.提前致谢.

在此输入图像描述

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    float values[] = { 130, 130, 130, 130, 130 };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout linear = (LinearLayout) findViewById(R.id.linearlay);
        values = calculateData(values);
        linear.addView(new MyGraphview(this, values));
    }

    private float[] calculateData(float[] data) {

        float total = 0;
        for (int i = 0; i < data.length; i++) {
            total += data[i];
        }
        for (int i = 0; i < data.length; i++) {
            data[i] …
Run Code Online (Sandbox Code Playgroud)

android android-canvas

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

Android Bitmap Masking(Xfermode)背后留下不透明的黑色背景

我有一个自定义视图,在onDraw()我,我试图执行位图屏蔽.我有一个squareBitmap(红色)填充整个视图,我有一个circleBitmap(蓝色)充当面具.我正在使用模式:PorterDuff.Mode.DST_IN.

我期待的结果是一个红色的圆圈.我明白了,但我也得到了一个黑色的不透明背景.我不想要这种不透明的背景,而应该是透明的.Figure 1是我得到Figure 2的结果,是我正在寻找的结果.

图1:我得到的结果 图2:我正在寻找的结果

我的代码:( onDraw()为了这个问题,我把所有内容都移到了里面)

protected void onDraw(Canvas canvas) {

    final int width = canvas.getWidth();
    final int height = canvas.getHeight();

    Bitmap circleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas circleCanvas = new Canvas(circleBitmap);
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    p.setStyle(Paint.Style.FILL_AND_STROKE);
    p.setColor(Color.BLUE);
    circleCanvas.drawCircle(width / 2, height / 2, width / 2, p);

    p.setColor(Color.RED);
    Bitmap squareBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas squareCanvas = new Canvas(squareBitmap);
    final Rect squareRect = new Rect(0, …
Run Code Online (Sandbox Code Playgroud)

android android-canvas android-view android-bitmap

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

在Android画布上应用缩放效果后,缩放比例位置错误

首先,这是一个最初在这里提出的跟进问题,在Android中平移,缩放和缩放自定义的Canvas绘图视图

由于还没有答案,我终于使用android-gesture-detector解决了我的问题

应用缩放/缩放手势后,我发现,画布绘制坐标仍然指向旧位置(在应用缩放之前),而不是绘制完全相同的触摸坐标.基本上,在缩放或拖动画布后,我无法获得正确的画布坐标.

在缩放之前,

在此输入图像描述

缩小后,触摸点将绘制在之前的位置.我希望它能够在当前触摸位置上绘制,

在此输入图像描述

示例代码,

public class DrawingView extends View {

    private void setupDrawing() {

        mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener());

        mgd = new MoveGestureDetector(ctx, mgl);
        sgd = new ScaleGestureDetector(ctx, sgl);
        rgd = new RotateGestureDetector(ctx, rgl);

}

class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor();
            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
            invalidate();
            return true;
        }
    }

    MoveGestureDetector.SimpleOnMoveGestureListener mgl = new …
Run Code Online (Sandbox Code Playgroud)

android android-canvas android-view android-gesture android-touch-event

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

在 Android 上使用 Jetpack Compose 模糊卡片后面分层的内容

我正在尝试实现像这篇文章中突出显示的模糊效果:

我正在使用 Jetpack Compose:

@Composable
fun MainApp() {
    val linearGradientBrush = Brush.linearGradient(
        colors = listOf(
            Color(0xFF5995EE),
            Color(0xFFB226E1),
            Color(0xFFE28548)
        ),
        start = Offset(Float.POSITIVE_INFINITY, 0f),
        end = Offset(0f, Float.POSITIVE_INFINITY),
    )

    val transparentGradientBrush = Brush.linearGradient(
        colors = listOf(
            Color(0x66FFFFFF),
            Color(0x1AFFFFFF)
        )
    )
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Box() {
            Card(
                modifier = Modifier
                    .size(150.dp)
//                    .blur(10.dp, edgeTreatment = BlurredEdgeTreatment.Unbounded)
                    .clip(shape = CircleShape)

                    .background(linearGradientBrush),

                backgroundColor = Color.Transparent,
                elevation = 0.dp,
            ) {
            }

            Card(
                modifier …
Run Code Online (Sandbox Code Playgroud)

android android-canvas android-blur-effect android-jetpack-compose

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