标签: android-canvas

如何更改 Google 地图中道路的颜色?

我正在寻找一种方法来更改 Android 版 MapView 中的道路颜色(黄色)。我想过重写该onDraw方法,然后检查每个像素并更改它,但该方法是最终的。

我还想过用 ViewGroup 包装 MapView,然后尝试覆盖它的 onDraw,但我不知道该怎么做。

有人有想法吗?

谢谢。

android google-maps android-canvas android-mapview

5
推荐指数
1
解决办法
2331
查看次数

如何使用android视图的IsDirty()属性

我正在使用android3.0开发应用程序。我需要更新之前绘制的画布。在搜索这个时,我在 Android API 文档中看到了 View 类的“isDirty()”。

但我并没有得到太多关于这方面的明确信息。请建议我“如何将画布的一部分设置为脏并仅更新该部分?”。

android view android-canvas

5
推荐指数
1
解决办法
2701
查看次数

自定义进度条和仪表

我想创建自定义进度小部件,如图所示。经过一番研究我发现:

  • 对于针规,我可以修改这个小部件
  • 对于水平进度表,我应该自定义 Android 原生进度条。
  • 对于水指示器,我应该使用 android canvas 创建一个自定义小部件。

我的问题是:我是否使用正确的方法来创建和实现这些小部件?或者您认为任何更好的建议或教程可能会帮助我创建这些,特别是“水指示器”和自定义 Android 本机进度条。

谢谢。

自定义进度条和仪表

android gauge android-progressbar android-canvas

5
推荐指数
0
解决办法
3909
查看次数

在画布上绘制而不清除先前绘制的位图

我需要在画布上绘制位图,然后开始在其上绘制。当我在画布上绘制其他对象时,先前绘制的位图将被清除。为了避免位图被清除,我必须在每次 ondraw() 调用中绘制它。必须有其他方法来更新之前绘制的图形,否则它会非常有效,因为我可能必须绘制许多位图。

    @Override
protected void onDraw(Canvas mCanvas) {
    for (Pair<Path, Paint> p : paths) {
        mCanvas.drawPath(p.first, p.second);
    }
    if(merge){
        canvas.drawBitmap(bmp, transform, new Paint());
    }

}
Run Code Online (Sandbox Code Playgroud)

那么,什么是最有效的方法来绘制以前绘制的图形而不丢失它。

android android-canvas

5
推荐指数
1
解决办法
1178
查看次数

Android:如何使用画布/绘制位图缩放位图以适合屏幕尺寸?

我正在拍摄图像并使用画布将其绘制到屏幕上。我想根据屏幕尺寸缩放它。

这是我尝试过的,但它切断了图像的一大块:

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.myimage);
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);

Rect frameToDraw = new Rect(0, 0, width, height);
RectF whereToDraw = new RectF(0, 0, width, height);

canvas.drawBitmap(bitmap,frameToDraw,whereToDraw, paint);
Run Code Online (Sandbox Code Playgroud)

我知道我做错了一些事情,但我不确定到底是什么。此代码会导致图像超出屏幕尺寸。我希望它能够缩放到屏幕的大小。我还将绘制较小的图像,我还需要根据屏幕的大小进行缩放,但不是全屏。

android canvas android-canvas android-bitmap

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

Android - 带有文本跟随的搜索栏

我想创建一个带有以下文本的自定义 SeekBar,根据拇指的位置更新其位置(和进度)。

我需要实现什么:

带有文字的搜索栏

假设:

  1. 最小值 = 1000
  2. 最大值 = 30000

情况 1: 进度为 0%(或最小值 = 1000)并且文本应与拇指的左边框对齐。

情况 2: 进度文本显示在 Thumb drawable 上方并居中,因为它有空间可以绘制自己。

情况 3: 进度为 100%(或最大值 = 3000)并且文本应与 Thumb 的右边框对齐。

我已经有什么:

public class CustomSeekBar extends SeekBar {
    private Paint paint;
    private int[] coordCenterTemp = new int[]{0, 0};

    // .....

private void init() {
    paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    paint.setTextSize(sp2px(20));
    paint.setTextAlign(Paint.Align.CENTER);
}

private int sp2px(int sp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
}

@Override
protected synchronized void onDraw(Canvas canvas) { …
Run Code Online (Sandbox Code Playgroud)

android draw textview android-canvas android-seekbar

5
推荐指数
1
解决办法
7449
查看次数

在启用硬件加速的情况下对视图进行动画处理时,LAYER_TYPE_NONE 和 LAYER_TYPE_HARDWARE 之间有什么区别

根据Android开发指南,将为带有LAYER_TYPE_NONE的硬件加速视图创建显示列表,而将为带有LAYER_TYPE_HARDWARE的硬件加速视图创建硬件层。在这两种方法中应用旋转动画时都不需要重绘视图。那么,在启用硬件加速的情况下对视图进行动画处理时,LAYER_TYPE_NONE 和 LAYER_TYPE_HARDWARE 之间的实际区别是什么\xef\xbc\x9f

\n

android android-animation android-canvas

5
推荐指数
1
解决办法
2254
查看次数

如何从Android画布中获取触摸形状(弧形)?

我正在构建一个自定义视图。

它有4条弧线。

我正在使用RectF形状绘制弧线,期间onDraw()

// arcPaint is a Paint object initialized
// in the View's constructor
arcPaint.setStrokeWidth(strokeWidth);
arcPaint.setColor(arcColor);

// Draw arcs, arc1, arc2, arc3 & arc4 are
// measured and initialized during onMeasure()
canvas.drawArc(arc1, startAngle, arc1Angle, false, arcPaint);
canvas.drawArc(arc2, startAngle, arc2Angle, false, arcPaint);
canvas.drawArc(arc3, startAngle, arc3Angle, false, arcPaint);
canvas.drawArc(arc4, startAngle, arc4Angle, false, arcPaint);
Run Code Online (Sandbox Code Playgroud)

所以,结果是:

在此输入图像描述

如果我RectF使用canvas.drawRect()以下代码绘制对象:

canvas.drawRect(arc1, arcPaint);
canvas.drawRect(arc2, arcPaint);
canvas.drawRect(arc3, arcPaint);
canvas.drawRect(arc4, arcPaint);
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

在此输入图像描述

将圆弧和矩形绘制在一起,得出:

在此输入图像描述

我知道我可以重写该onTouchEvent()方法并获取 X、Y 坐标,但我不知道每个坐标如何与画布中绘制的每个形状相关。

我想做的是检测何时触摸 内的圆弧而不是矩形canvas …

android android-custom-view android-canvas

5
推荐指数
1
解决办法
1260
查看次数

圆角 ItemDecoration

我有一个RecyclerViewwith GridLayoutManager,其中包含各种ViewTypes(以及SpanSizes )的项目。我需要为所有R.layout.item_image类型圆角,如下图所示

圆角示例

所以我创建了一个ItemDecoration计算Rect这些项目将被绘制的对象。然后将其剪辑Canvas到此Rect(用于Path圆角):

public class RoundCornersDecoration extends RecyclerView.ItemDecoration {
    private final float radius;
    private final RectF defaultRectToClip;

    public RoundCornersDecoration(float radius) {
        this.radius = radius;
        defaultRectToClip = new RectF(Float.MAX_VALUE, Float.MAX_VALUE, 0, 0);
    }

    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        final RectF rectToClip = getRectToClip(parent);

        // has no items with ViewType == `R.layout.item_image`
        if (rectToClip.equals(defaultRectToClip)) {
            return;
        } …
Run Code Online (Sandbox Code Playgroud)

android android-custom-view android-canvas android-view android-recyclerview

5
推荐指数
1
解决办法
1471
查看次数

有效地将位图数组转换为视频

使用 Jcodec 库,我成功地从 Bitmap 对象数组生成视频文件并将其存储在 Android 文件系统上。

然而,编码时间太长。我考虑过缩小每个位图以加快速度,但这似乎不起作用。尽管进行了广泛的研究,我还是很难找到有用的答案。

下面的代码目前是我创建位图的方式,其中canvasView.getWidth()和分别canvasView.getHeight()对应于1920 x 1280

public Bitmap loadBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap(canvasView.getWidth(), canvasView.getHeight(), Bitmap.Config.RGB_565);
    Log.i("Downloading", "OWidth: " + b.getWidth() + " --- " + "OHeight: " +  b.getHeight());

    Canvas c = new Canvas(b);
    c.drawColor(Color.WHITE);   // Essential

    v.draw(c);
    v.invalidate();
    v.requestLayout();

    return b;
}
Run Code Online (Sandbox Code Playgroud)

我注意到当你将这两个参数更改为较小的值时,IE:

Bitmap.createBitmap(256, 256, Bitmap.Config.RGB_565);
Run Code Online (Sandbox Code Playgroud)

编码速度显着加快。

整个视图的大小是1920 x 1280,因此createBitmap上面显示的方法只能捕获窗口的一小部分(256 x 256),这不是我所需要的。

我需要帮助找到一种更有效地将位图数组编码为视频的方法,或者使用我正在使用的相同方法,但缩小每个位图,同时保持整个图像的可见性并加快编码过程。

encoding android bitmap android-canvas android-bitmap

5
推荐指数
1
解决办法
4937
查看次数