我正在寻找一种方法来更改 Android 版 MapView 中的道路颜色(黄色)。我想过重写该onDraw方法,然后检查每个像素并更改它,但该方法是最终的。
我还想过用 ViewGroup 包装 MapView,然后尝试覆盖它的 onDraw,但我不知道该怎么做。
有人有想法吗?
谢谢。
我正在使用android3.0开发应用程序。我需要更新之前绘制的画布。在搜索这个时,我在 Android API 文档中看到了 View 类的“isDirty()”。
但我并没有得到太多关于这方面的明确信息。请建议我“如何将画布的一部分设置为脏并仅更新该部分?”。
我想创建自定义进度小部件,如图所示。经过一番研究我发现:
我的问题是:我是否使用正确的方法来创建和实现这些小部件?或者您认为任何更好的建议或教程可能会帮助我创建这些,特别是“水指示器”和自定义 Android 本机进度条。
谢谢。
我需要在画布上绘制位图,然后开始在其上绘制。当我在画布上绘制其他对象时,先前绘制的位图将被清除。为了避免位图被清除,我必须在每次 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)
那么,什么是最有效的方法来绘制以前绘制的图形而不丢失它。
我正在拍摄图像并使用画布将其绘制到屏幕上。我想根据屏幕尺寸缩放它。
这是我尝试过的,但它切断了图像的一大块:
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)
我知道我做错了一些事情,但我不确定到底是什么。此代码会导致图像超出屏幕尺寸。我希望它能够缩放到屏幕的大小。我还将绘制较小的图像,我还需要根据屏幕的大小进行缩放,但不是全屏。
我想创建一个带有以下文本的自定义 SeekBar,根据拇指的位置更新其位置(和进度)。
我需要实现什么:
假设:
情况 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开发指南,将为带有LAYER_TYPE_NONE的硬件加速视图创建显示列表,而将为带有LAYER_TYPE_HARDWARE的硬件加速视图创建硬件层。在这两种方法中应用旋转动画时都不需要重绘视图。那么,在启用硬件加速的情况下对视图进行动画处理时,LAYER_TYPE_NONE 和 LAYER_TYPE_HARDWARE 之间的实际区别是什么\xef\xbc\x9f
\n我正在构建一个自定义视图。
它有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 …
我有一个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
使用 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),这不是我所需要的。
我需要帮助找到一种更有效地将位图数组编码为视频的方法,或者使用我正在使用的相同方法,但缩小每个位图,同时保持整个图像的可见性并加快编码过程。
android ×10
android-canvas ×10
android-view ×1
bitmap ×1
canvas ×1
draw ×1
encoding ×1
gauge ×1
google-maps ×1
textview ×1
view ×1