Articles of android canvas

Android:绘制到canvas,左下角的方式对应于(0,0)?

我正在尝试编写一个我可以在Android中使用的图形类(我知道预先存在的图形类),但是转换我的所有坐标都会很痛苦。 是否有一种简单的方法可以让屏幕坐标从左下方开始?

在Canvas for Android中撤消和重做

我正在使用定制版的FingerPaint for Android以及其他一些function,例如插入图像和移动它们。 我决定实施一个Undo&Redo,因为它会让生活变得更轻松。 为了实现它,我最终决定使用一个Stack来推送视图的绘图缓存,并且每当我想要回到之前的状态时我都会从那里推送内容。 因此,使用FingerPaint作为基础,我有以下内容: private void touch_up() { mPath.lineTo(mX, mY); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // I enable the set drawing cache… myView.setDrawingCacheEnabled(true); // … and I add the cache to the stack undoStack.add(myView.getDrawingCache()); indexOfUndoRedo++; // kill this so we don’t double draw mPath.reset(); } 目前只有在修补之后才会更新堆栈,因为我仍然在弄清楚如何解决这个问题。 当我想申请重做时,我会执行以下操作: private void […]

如何在canvas上绘制大尺寸文字?

我想在canvas月份的文字垂直沿着屏幕高度绘制。 绘制初始化: this.paint = new Paint(); this.paint.setAntiAlias(true); this.paint.setDither(true); this.paint.setSubpixelText(true); this.paint.setColor(color_text_dark); this.paint.setTextAlign(Align.RIGHT); 画画: // Set the scale to the widest month float scale = getHeight() / this.max_month_width; String month_string = FULL_MONTH_NAME_FORMATTER. format(active_month_calendar.getTime()); canvas.save(); canvas.translate(getWidth(), 0); canvas.rotate(-90); canvas.scale(scale, scale); canvas.drawText(month_string, 0, 0, this.paint); canvas.restore(); 结果在hdpi屏幕上看起来不错,但在xhdpi上非常难看和像素化。 我在各种设备上做了更多测试,并了解结果取决于Android版本,而不是屏幕密度和分辨率。 代码在2.x平台上运行良好,但在4.0.3+上不起作用。 假设,这里改变了Android绘图实现。 完整代码,你可以在这里看到。 hdpi版本2.3.5 (也测试2.2 ) xhdpi版本4.2 (也测试4.1,4.0.3 ) 为油漆抗锯齿尝试不同的变化,亚像素文本没有效果。 我该如何解决这个问题?

如何在android中保存绘图canvas?

我正在使用开发者网站的这个API演示, 这个演示。 但我很奇怪如何将该图像保存到我的Andrtoid设备。 请任何人给代码将该绘制的图像保存到Android设备。 谢谢。

canvas上用油漆以更好的分辨率绘图? (机器人)

我用Canvas和Paint制作了一个小装载圈。 这是我第一次尝试使用这些类,所以它可能是我错误使用的东西。 我的问题是,绘画的分辨率太低了。 我可以清楚地看到像素。 我怎么能改进这个? 顺便说一下这是我的class级: public class LoadingCircle extends LinearLayout { public LoadingCircle(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); } // time int countDownTime = 180; Paint paint = new Paint(); RectF oval = new RectF(); Path path = new Path(); // value int value = 360 / countDownTime; // starting progress int […]

在Android Canvas上围绕字符串设置矩形

所以我使用Canvas.drawText在Canvas上绘制一些字符串。 问题是我想在它之前绘制一个矩形,以便文本显示在矩形的中心。 但我遇到了一个真正的问题。 实际上, drawText提供的x和y坐标不是真实文本的“左上角”,而是字符开始的行。 有一个方法Paint.getTextBounds在将要绘制的文本的(0,0)处返回一个“具有隐含原点”的矩形。 问题是原点是(0,0) 。 该框的宽度和高度是正确的,但我不知道如何将其左上角放在canvas上绘制的字符串的左上角。 我想我应该使用FontMetrics ,但由于FontMetrics返回的很多值都没有记录,所以我不确定如何将它们用于我的目的。

在Android上将canvas保存到位图

关于将Canvas的内容放入Bitmap,我遇到了一些困难。 当我尝试这样做时,文件的文件大小约为5.80KB,但它看起来完全是空的(每个像素都是’#000’)。 canvas绘制了一系列由手写形成的相互连接的线条。 下面是我对视图的onDraw。 (我知道它阻止了UI线程/糟糕的做法/等等……但是我只需要让它工作) 谢谢。 @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); if (IsTouchDown) { // Calculate the points Path currentPath = new Path(); boolean IsFirst = true; for(Point point : currentPoints){ if(IsFirst){ IsFirst = false; currentPath.moveTo(point.x, point.y); } else { currentPath.lineTo(point.x, point.y); } } // Draw the path […]

使用canvas垂直和水平居中文本

我正在尝试水平和垂直对齐位图中的文本,我读了几篇文章,但我找不到解决方案。 位图是一个简单的圆形图像。 我发布了当前的代码。 它或多或少都有效,但是文本没有完全居中,它看起来有点在左边,有点在顶部,我的意思是我似乎必须添加一个偏移来将它移动到右边和底部。 public static float convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); float px = dp * (metrics.densityDpi / 160f); return px; } v = (ImageView) findViewById(R.id.imageView1); Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.marker).copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(b); Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); textPaint.setARGB(255, 0, 0, 0); […]

为什么在某些Android 2.2手机上绘制位图的速度非常慢?

我有一个简单的纸牌游戏,用户可以在屏幕上拖放卡片。 在一些2.2 Android手机上,如Droid和EVO,卡片绘图非常慢。 这很奇怪,因为它发生在一些更快的手机上。 然而,并不是我在Droid和Droid X上测试的所有手机和程序运行良好也在G1等慢速手机上运行良好。 在Motorolla发布了针对Droid的2.2更新后,我开始收到关于此的报告。 这是我提出的解决方案,但它确实降低了我的图形质量。 渐变看起来很可怕。 我换了这个 Bitmap.createBitmap(newBmp.getWidth(), newBmp.getHeight(), Bitmap.Config.ARGB_8888); 对此 Bitmap.createBitmap(newBmp.getWidth(), newBmp.getHeight(), Bitmap.Config.ARGB_4444); 问题消失但看起来很痛苦。 我需要保留alpha通道,所以我不能使用RGB_565。 有没有办法保持我的高质量图像,而不是让它运行得那么慢?

将SurfaceView中的canvas缩放到比屏幕大小更大的尺寸

我正在制作一个新的应用程序,我正在使用Canvas。 我正在缩放canvas,但我将大小设置为: public static final int WIDTH = 1920; public static final int HEIGHT = 1080; (屏幕将是横向的。这就是为什么宽度大于高度)这意味着如果这个应用程序是用于纵向方向: public static final int WIDTH = 1080; public static final int HEIGHT = 1920; 缩放为canvas通常是: public void render(Canvas c) { super.draw(c); final float scaleFactorX = getWidth()/(WIDTH*1.f); final float scaleFactorY = getHeight()/(HEIGHT*1.f); if (c != null) { final int […]