我准备了涂料应用程序,我的应用程序包含一个自定义视图的paint.when我们在自定义视图中绘制任何东西只收集绘制的像素并存储在数组列表中,首先它工作正常(但它花了很多时间)和第二次" Activity MyAlphabets(在应用程序MyAlphabets中)没有响应(强制关闭并等待)".
我的代码是,
public void onDraw(Canvas canvas) {
if (myDrawBitmap == null) {
myDrawBitmap = Bitmap.createBitmap(canvas.getWidth(),
canvas.getHeight(), Bitmap.Config.ARGB_8888);
bmpDrawCanvas = new Canvas(myDrawBitmap);
intDrawArray = new int[myDrawBitmap.getWidth()
* myDrawBitmap.getHeight()];
}
if (bmpDrawCanvas != null) {
for (Path path : MyActivity.mArryLstPath) {
bmpDrawCanvas.drawPath(MyActivity.mPath,
mPaintAlphabet);
}
myDrawBitmap.getPixels(intDrawArray, 0, 220, 0, 0, 220, 305);
for (int i = 0; i < intDrawArray.length; i ++) {
if (intDrawArray[i] == 0xFFFFFFFF) {
if (MyActivity.mArryLstDrawnPixels.contains(i)) {
} else {
MyActivity.mArryLstDrawnPixels.add(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我们点击"强制关闭"时Logcat是,
INFO/ActivityManager(52): Killing …Run Code Online (Sandbox Code Playgroud) 在我的自定义视图中,我正在研究使用Canvas.getClipBounds()来优化我的onDraw方法(这样我每次调用时都只绘制了绝对必要的东西).
但是,我仍然希望绝对避免任何对象创建......
因此,我的问题是:getClipBounds()每次调用时都会分配一个新的Rect吗?或者只是简单地回收一个Rect?
如果它正在分配一个新对象,我可以通过使用来保存这个费用getClipBounds(Rect bounds),这似乎使用传递的Rect而不是它自己的吗?
(你尖叫过早的优化之前,不要考虑放置在滚动型时,的onDraw可以被称为很多次每秒)
我想创建一个2D游戏,我想知道哪条路可以根据我的知识背景和游戏本身的一些细节.
我的背景(相关的东西):
我10天前开始学习android编程,我已经完成了游戏菜单.
我在java(桌面)编程方面有相当多的经验.
我在过去使用C++中的openGL有一些经验,但只做3d东西(我也记不起很多东西).我从来没有编写任何开放的GL着色器.我学习了诸如旋转/缩放/平移,应用纹理(纹理坐标)和一些非常原始的灯光等基本变换.
该游戏应该具有:
精灵.每帧+ -50平均可见.
捏缩放/平移手势.
此功能:能够将一个精灵移动到另一个地方,使用手指绘制要跟随的路径.这应该可以在任何缩放级别.
声音.枪声,爆炸,简单的短音.
作为奖励,有一些效果,如发光线,扭曲效果等,这将是很好的,但这不是必需的.
应该有简单的方法来绘制几何形状,如圆形/正方形/三角形等(我的意思是不是在游戏中它自己,而是在用于开发它的API中)
我想在半个月内完成游戏.
现在您认为最好的解决方案是游戏的特点,我的背景和时间可用吗?OpenGL ES 2.0?帆布?或API /图形/游戏引擎/库(哪些,是否有文档/教程?)?
游戏本身很简单.我提到的东西真的是这里最重要的东西,至少对我而言.
如何使用图形类绘制箭头?
我使用Android图形类,基本上我试图在地图上显示路径.所以我需要在画布上打印一个箭头.帮帮我搞清楚!
谢谢!
这是我用来绘制线条的方法之一.我想在每一行的边缘打印一个箭头.
// ArrayList<Point> ArrayListPoints = new ArrayList<Point>(); // Assign the shortest path here
// ArrayListPoints.add(new Point(262,100));
// ArrayListPoints.add(new Point(262,165));
// ArrayListPoints.add(new Point(346,165));
// ArrayListPoints.add(new Point(420,165));
ArrayList<Point> ArrayListPointsFINAL;
ArrayListPointsFINAL = storePath.ArrayListPoints;
if(ArrayListPointsFINAL == null){
System.out.println("ArrayListPointsFINAL is NULL");
}
else{
ArrayList<Float> ArrayList_X = new ArrayList<Float>();
ArrayList<Float> ArrayList_Y = new ArrayList<Float>();
//int size = get.ArrayListPoints.size();
for(int i=0; i<ArrayListPointsFINAL.size(); i++){
ArrayList_X.add(Float.parseFloat(String.valueOf(ArrayListPointsFINAL.get(i).x)));
ArrayList_Y.add(Float.parseFloat(String.valueOf(ArrayListPointsFINAL.get(i).y)));
}
for(int i=1; i<ArrayList_X.size(); i++){
Paint myPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
myPaint.setStrokeWidth(8/*1 /getResources().getDisplayMetrics().density*/);
myPaint.setColor(0xffff0000); //color.RED
// myPaint.setStyle(myPaint);
canvas.drawLine(ArrayList_X.get(i), ArrayList_Y.get(i), ArrayList_X.get(i-1), …Run Code Online (Sandbox Code Playgroud) 我正在开发Android应用程序,主要目的是在底部显示CNN突发新闻风格栏和一些图片.我创建了两个自定义视图,一个用于显示照片,另一个用于显示条形图.它在指定的时间内一次显示一张图片,并将当前图片与队列中的下一张图片交换.
要在底栏中为文本设置动画,我使用了canvas,onDraw()和handler.postDelayed.该解决方案的结果很差.文本移动不平滑,尤其是交换图像时.
我应该使用什么而不是画布?是否有任何基于OpenGL的lib可以使这个任务相对轻松?我试图使用AndEngine,但它缺乏文档和线程问题使我不再使用它.
public class Infobar extends View {
private List<Message> messages;
private Handler handler;
private Paint boxPaint;
private Paint defaultTextPaint;
private Paint importantTextPaint;
private long offset = 0;
private long maxOffset = 1000;
private int textWidth = 1000;
private int textHeight = 50;
private int measuredWidth;
private int measuredHeight;
private Runnable animateRunnable = new Runnable() {
public void run() {
animateMessage();
}
};
long startTime = new Date().getTime();
private int backgroundCol = Color.parseColor("#ffff00");
private int textColor = Color.parseColor("#000000");
private …Run Code Online (Sandbox Code Playgroud) 我刚刚使用Android进入基本绘图.我从一些简单的形状开始,但我遇到了一些问题.我想在画布的中心画一个圆圈.我看了几个例子,但似乎无法使它工作.我想这是因为我真的不明白哪些变量在哪里.
有人可以解释一下在我的屏幕中心绘制圆圈的正确方法.这是我的代码:
public class Circle extends View{
int width = this.getWidth();
int height = this.getHeight();
public Circle(Context context) {
super(context);
setFocusable(true);
}
protected void onDraw(Canvas canvas){
canvas.drawColor(Color.CYAN);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
//canvas.drawCircle(100, 100, 50, paint);
canvas.drawCircle(width/2, height/2, 100, paint);
Display disp = ((WindowManager)this.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
float radius = 0;//Radius caused an error so I initialized this variable
canvas.drawCircle(disp.getWidth()/2, disp.getHeight()/2, radius, paint);
}
Run Code Online (Sandbox Code Playgroud)
}
我有一个主位图,我需要在其他位图上绘制.
主位图具有一些半透明像素(具有alpha通道变量值的像素),因此在其上绘制的其他位图应与其合并,而不是完全覆盖颜色.
如何设置画布相对于半透明像素在主位图上绘制位图?
注意:alpha不适用于整个位图.这是每个像素.
我通过扩展View创建了一个自定义视图.
public class CustomView extends View {
private Canvas canvas2;
private Bitmap backingBitmap;
Run Code Online (Sandbox Code Playgroud)
在CustomView的构造函数中,我有以下代码:
backingBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
canvas2 = new Canvas(backingBitmap);
Run Code Online (Sandbox Code Playgroud)
在onDraw中,我有:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(100, 100, 50, paint);
canvas2.drawCircle(0, 0, 10, paint);
}
Run Code Online (Sandbox Code Playgroud)
我可以看到使用"canvas"对象绘制的圆,但不是使用"canvas2"对象绘制的圆.我的理解是,只需要创建一个可变的Bitmap并使其成为Canvas的支持位图.有人能指出这里有什么问题吗?
奖金问题:在屏幕上创建自定义画布对象的位置,以及如何设置其位置?
创建多个画布的原因:我有一个包含整个屏幕的SurfaceView.所以,它的画布基本上覆盖整个屏幕.我需要在屏幕内制作一个类似窗口的矩形,并且需要在该窗口的范围内制作动画.基本上,如果您在此窗口中翻译图像,则不应在窗口边界外绘制图像.
干杯!
我正在编写一个像素艺术应用程序,用户将在屏幕上绘制的图像绘制成像素外观.有两种方法可以解决它.保存后对图像进行像素化或手头有网格,以便用户绘制像素图像.我在后面的方法上找不到任何东西.所以我的第一个问题是画一个网格,如果一个单元被触摸,我会改变它的颜色.我尝试在画布上绘制矩形但这没有意义,因为我无法控制细胞.
我在考虑嵌套for循环,在每个单元格中创建一个位图?
我正在尝试lockCanvas()因为我想在预览之前修改相机图片.我是在onPreviewFrame上做的.
代码在这里:
public class MyPreview implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Log.d("Camera", "Got a camera frame");
Canvas c = null;
try {
c = mCamSH.lockCanvas(null);
Log.d("SOMETHING", "Got Bitmap");
} finally {
if (c != null) {
mCamSH.unlockCanvasAndPost(c);
}
}
}
} //public class MyPreview implements Camera.PreviewCallback
Run Code Online (Sandbox Code Playgroud)
不幸的是我总是在循环中遇到这个错误,问题是c = mCamSH.lockCanvas(null); :
E/SurfaceHolder? Exception locking surface
java.lang.IllegalArgumentException
at android.view.Surface.lockCanvasNative(Native Method)
at android.view.Surface.lockCanvas(Surface.java:76)
at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:831)
at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:811)
at cz.mrp.camera.CamActivity$MyPreview.onPreviewFrame(CamActivity.java:100)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:773)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4517)
at …Run Code Online (Sandbox Code Playgroud) android ×10
android-canvas ×10
bitmap ×2
graphics ×2
java ×2
opengl-es ×2
draw ×1
optimization ×1
surfaceview ×1