我正在制作一个需要动态动画的应用程序。(玩家动作)我正在使用该Canvas对象来执行此操作。我的第一个问题是“Canvas真的是处理这些动画的最佳方法吗?”,我的第二个问题是“如何将玩家重新绘制到Canvas?” 这是我的代码:
theGame.java:
package birdprograms.freezetag;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
public class theGame extends Activity {
players[] arr = {
new player(),
new player(),
new player(),
new player()
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new myView(this));
}
public class myView extends View {
Paint paint = new Paint();
public myView(Context context) {
super(context);
paint.setColor(Color.YELLOW);
}
@Override
public void onDraw(final Canvas canvas) {
arr[0].update(true, …Run Code Online (Sandbox Code Playgroud) 但它们并不相同。角的笔划不同。
我使用 2 个分隔线Path来绘制顶部形状:第一个用于黄色背景:
private val paint = Paint().apply {
isAntiAlias = false // pass true does not make change
color = Color.YELLOW
style = Paint.Style.FILL_AND_STROKE // pass only FILL does not make change
}
Run Code Online (Sandbox Code Playgroud)
第二个是:
private val strokePaint = Paint().apply {
isAntiAlias = false // pass true does not make change
color = Color.BLACK
strokeWidth = 2.toPx().toFloat()
style = Paint.Style.STROKE
}
Run Code Online (Sandbox Code Playgroud)
在onDraw()函数中我用它们来绘制:
override fun onDraw(canvas: Canvas) {
drawPath()
canvas.drawPath(path, paint)
canvas.drawPath(path, strokePaint)
// …Run Code Online (Sandbox Code Playgroud) 我正在使用 Jetpack Compose 来实现绘制“逐渐增长的线”的要求,即从指定的起点和点开始并逐渐“增长”直到到达指定的终点的线。我之前用自定义视图实现了这个,效果很好。我的逻辑要求根据某些条件一次又一次地重新调用“onDraw()”。为此,我在使用自定义视图时使用了“invalidate()”。但现在我正在使用 Jetpack Compose,无法找到重新组合“Canvas”的方法。
这是我的 Jetpack 为“逐渐增长的线”编写的代码:
@Composable
fun SplashUI() {
var test = remember { mutableStateOf(0) }
Canvas(modifier = Modifier.fillMaxSize()) {
// starting point
x1 = 0.0;
y1 = size.height / 2.0;
// ending point
x2 = size.width.toDouble()
y2 = size.height / 2.0;
divideLineIntoEqualParts();
if (test.value < listOfPoints.size) {
drawLine(
Color.Black,
Offset(
listOfPoints.get(0)?.x!!,
listOfPoints.get(0)?.y!!
),
Offset(
listOfPoints.get(inte)?.x!!,
listOfPoints.get(inte)?.y!!
),
strokeWidth = 5f
);
}
test.value = test.value + 1 //This doesn't trigger recomposition of canvas
//Recomposition of …Run Code Online (Sandbox Code Playgroud) android android-canvas android-jetpack-compose android-jetpack-compose-canvas
我打算在我的游戏中实现一组新的数字:简单的圆圈.绘制的精灵(在这种情况下为圆圈)的数量从2-3开始,并且可以无限地(可能)上升.最大值可能在60左右.总共将有5种类型的圆圈,每种圆圈都有不同的颜色,也可能是大小.现在看到我将不会实现它,直到星期一,我以为我会在stackoverflow问它.
有人知道哪种方法更快吗?
我创建了一个类:
public class TestCanvas extends View {
public TestCanvas(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawText("kal", 0, 100, paint);
canvas.save();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我从活动中调用该类:
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TestCanvas tcanvas=new TestCanvas();
frameLayout=(FrameLayout)findViewById(R.id.frameLayout1);
frameLayout.addView(tcanvas);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想将canvas插入活动类并设置为ImageView.我该怎么做?
我正在尝试在android中创建一个实时图表实用程序,并且在大多数情况下它可以工作,除了当我在其中一个路径中获得太多数据点时它会破坏openGL.我正在使用路径,因为当传入的值超出图形的当前边界时,我正在通过矩阵转换整个数据集.我是以错误的方式来做这件事的吗?是否有更好/更合适的API用于此类事情?如果可能/我知道怎么做,我会很高兴修剪当前界限的路径.谢谢!
onDraw有:
@Override
protected void onDraw(Canvas canvas) {
scaleX = getWidth() / (maxX - minX);
scaleY = getHeight() / (maxY - minY);
// TODO: Use clips to draw x/y axis, allow color to be defined in attributes, etc.
canvas.drawColor(0xFF000000);
for (DataLine line : mPathList.values()) {
canvas.drawPath(line, line.getPaint());
}
}
Run Code Online (Sandbox Code Playgroud)
(DataLine是Path的子类,包含Paint对象)
有问题的错误是来自OpenGLRenderer的警告:"形状路径太大而无法渲染到纹理中"
我已经为绘图设置了画布.我现在的问题是如何清除图纸.
试过这样做无济于事.
public void clear()
{
circlePath.reset();
mPath.reset();
// Calls the onDraw() method
//invalidate();
}
Run Code Online (Sandbox Code Playgroud)
请在这里查看整个代码:
https://gist.github.com/akosijiji/a29cca90bead2e5e35ad
真的很感激任何帮助.
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class SingleTouchEventView extends View {
private Paint paint = new Paint();
private Path path = new Path();
public boolean cc = false;
public SingleTouchEventView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
paint.setStrokeWidth(18f);
paint.setColor(Color.LTGRAY);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
if(cc)
{
Bitmap back = BitmapFactory.decodeResource(getResources(), R.drawable.black_square);
Bitmap cb = Bitmap.createScaledBitmap(back, 0, 0, false);
canvas.drawBitmap(cb,0,0,null);
cc …Run Code Online (Sandbox Code Playgroud) 我是Android新手,我有两个图像,一个是空图像,另一个是表示进度条的完整图像.
有些人可以向我解释我如何只使用canvas.drawBitmap绘制完整图像的百分比.
我不希望每次都调整位图图像的大小.
谢谢
乔纳森
我想填充画布里面的颜色,这是我的代码:
Bitmap bitMap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
bitMap = bitMap.copy(bitMap.getConfig(), true);
Canvas canvas = new Canvas(bitMap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(4.5f);
canvas.drawCircle(50, 50, 30, paint);
Run Code Online (Sandbox Code Playgroud)
此代码生成带有边框颜色的圆.如何用颜色填充圆圈?
android ×10
android-canvas ×10
java ×3
android-jetpack-compose-canvas ×1
charts ×1
custom-view ×1
draw ×1
geometry ×1