Articles of android canvas

在Android绘图应用程序中实现橡皮擦 – 黑色轨迹然后透明

我有一个Android的绘图应用程序,我目前正在尝试添加一个真正的橡皮擦。 在此之前,我刚刚使用白色涂料作为橡皮擦,但现在我不再使用背景颜色和图像了。 我通过在透明canvas下面显示图像来实现此目的。 我面临的问题是每当我启用我的橡皮擦时,它会在我用手指向下时画出一条坚实的黑色痕迹,但是一旦我释放它就会变成透明的。 请参见下面的屏幕截图: 这是我的手指在屏幕上时的外观 – 一条坚实的黑色小道 这是我从屏幕上移开手指后的样子 所以,我似乎越来越接近了,但我找不到正确的设置组合,以避免在擦除时我的手指触摸时的黑色痕迹。 以下是一些相关的代码片段: 的onDraw @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.TRANSPARENT); canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); canvas.drawPath(mPath, mPaint); canvas.drawPath(mPreviewPath, mPaint); } 的onTouchEvent @Override public boolean onTouchEvent(MotionEvent event) { float currentX = event.getX(); float currentY = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchStart(currentX, currentY); invalidate(); break; case MotionEvent.ACTION_MOVE: touchMove(currentX, […]

如何在Android中完全加载ImageView时获取

我正在开发一个应用程序,它在一堆图像上绘制线条。 要选择这些图像,我有一个广播组,每当用户点击一个单选按钮时,图像就会加载所有图纸。 在我的收音机听众中,我有以下代码: bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y); mImage.setImageBitmap(bitmap); mImage.setDrawLines(true); mImage.setImageBitmap(loadBitmapFromView(mImage)); 我从Android开发人员的这个链接获得的decodeSampledBitmapFromResource方法(它更有效地加载位图) http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 这是我调用的方法来获取视图的位图 public static Bitmap loadBitmapFromView(View v) { Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); v.draw(c); return b; } 我正在设置mImage的图像Bitmap,因为我正在使用ImageViewTouch库(它可以在ImageView上进行缩放缩放),如果我不这样做,所有canvas绘图都会被删除,图像上的任何交互都会被删除(比如放大)输入/输出)。 错误日志如下 07-11 21:13:41.567: E/AndroidRuntime(20056): java.lang.IllegalArgumentException: width and height must be […]

canvas – 在Android上放大,移动和缩放

我目前正在webview图像(下面的大象)上实现绘图function。 我没有绘制它的问题,但缩放function在绘图上做了一些时髦的东西(下面的第二张图片)。 当我放大时,绘图不会缩放而是转换。 缩放绘图也不起作用。 我的代码如下: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); canvas.drawPath(drawPath, drawPaint); canvas.scale(mScaleFactor, mScaleFactor); canvas.restore(); clipBounds = canvas.getClipBounds(); } @Override public boolean onTouchEvent(MotionEvent event) { mScaleDetector.onTouchEvent(event); float touchX = event.getX() / mScaleFactor + clipBounds.left; float touchY = event.getY() / mScaleFactor + clipBounds.top; if (Deal.on) switch (event.getAction()) { case […]

canvas’drawLine和drawRect不包括结束位置?

令我惊讶的是,我刚刚发现drawLine和drawRect不包括结束位置,即: canvas.drawLine(100, 100, 100, 100, paint); 要么 RectF rect = new RectF(100, 100, 100, 100); canvas.drawRect(rect, paint); 不会画任何东西。 我的油漆定义如下: Paint paint = new Paint(); paint.setAntiAlias(false); paint.setStyle(Paint.Style.FILL); return paint; 我已经尝试将我的油漆定义为FILL_AND_STROKE,但它无济于事。 Android的drawPaint()javadoc甚至没有列出stopX和stopY参数! 所以,如果我想绘制一条完全从beginY到endY(包括)的垂直线,我必须执行以下操作: canvas.drawLine(constX, beginY, constX, endY + 1) 请注意,我没有将1添加到结束X位置,只添加到结尾Y(xstays与我想要的垂直线相同)。 我的设备是HTC SENSE。 编辑:西蒙,你是对的,而不是问一个问题,我只是试图分享我的惊讶,因为Android在基本的绘图这样的基本情况下没有做文档所说的,并确保我没有’在我的路上做任何愚蠢的错误。 为了让自己更清楚:drawRect的javadoc说: public void drawRect(float left,float top,float right,float bottom,Paint paint) 使用指定的绘制绘制指定的Rect。 矩形将根据绘画中的样式填充或加框。 left – 要绘制的矩形的左侧 […]

如何放大/缩放图像的一部分

我正在创建一个应用程序,用户可以在该应用程序中单击部分图像并在WebView的角落获得放大版本。 我设法制作一个可以制作缩放版本的Paint ,但它显示错误的位置,就像有一些偏移。 我知道这个问题已被问过很多次并且已经得到了回答,但似乎并没有帮助那些解决方案。 这是我用过的代码: @Override public boolean onTouchEvent(@NonNull MotionEvent event) { zoomPos = new PointF(); zoomPos.x = event.getX(); zoomPos.y = event.getY(); matrix = new Matrix(); mShader = new BitmapShader(MainActivity.mutableBitmap, TileMode.CLAMP, TileMode.CLAMP); mPaint = new Paint(); mPaint.setShader(mShader); outlinePaint = new Paint(Color.BLACK); outlinePaint.setStyle(Paint.Style.STROKE); int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: zooming = […]

如何在canvasandroid上绘制路径时覆盖总面积?

我使用下面的代码在位图canvas上绘制线条,同时手指触摸移动…这里我发布了部分代码,它工作正常.. 如下图所示,黑色和白色位图在触摸拖动时被擦除。我使canvas透明,因此父版面背景(彩色图像)变得可见。 我想知道,删除了多少区域(比如50%或60%的位图)..有什么方法可以find它吗? //Erasing paint mDrawPaint = new Paint(); mDrawPaint.setAntiAlias(true); mDrawPaint.setDither(true); mDrawPaint.setStyle(Paint.Style.STROKE); mDrawPaint.setStrokeJoin(Paint.Join.ROUND); mDrawPaint.setStrokeCap(Paint.Cap.ROUND); mDrawPaint.setStrokeWidth(50); mDrawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); BlurMaskFilter mBlur = new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL); mDrawPaint.setMaskFilter(mBlur); private void doDraw(Canvas c) { c.drawBitmap(mBitmap, 0, 0,null ); } private float mX, mY; private static final float TOUCH_TOLERANCE = 1; void touch_start(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX […]

Android Canvas清晰透明

我试图从canvas上“擦除”。 就像清理canvas的非常简单的测试一样,我实现了以下内容: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.argb(140, 0, 0, 0)); canvas.drawColor(0, Mode.CLEAR); } Color.argb(140, 0, 0, 0)将此视图的视图设置为灰色。 drawColor(0, Mode.CLEAR)使屏幕完全变黑,而不是删除之前应用的调光。 这个想法来自这里

拖动并移animation布上绘制的圆圈

我正在开发一个Android应用程序,应该允许用户在canvas上绘制一个圆圈并拖动它。 我已经能够在上面绘制线条和圆圈。但我似乎无法拖动它。 是否可以在Android中拖animation布上绘制的对象?例如,如果我在圆圈内检测到触摸,如何从先前位置删除圆圈并将其移动到当前位置? 我已经尝试过invalidate() 。但是如果用户绘制了多个圆并想要移动所有这些,它就无法工作。

Android – 使用Flood-Fill时的Canvas Black

当我实现我的flood-fill类时,它将整个Bitmap变为黑色。 显然这不是预期的效果。 我查看了以下主题: https://stackoverflow.com/questions/24030858/flood-fill-is-coloring-my-entire-screen 黑色图像导致的洪水填充算法 在android上填充着色 从我所看到的,我正在做他们在这些解决方案中提出的所有内容,但它并没有让我find解决问题的方法。 所以要切入追逐,这里的代码有一些简短的解释。 XML 我正在使用相对布局并将两个ImageViews直接定位(堆叠)在彼此之上。 它们都具有相同的图像,这就产生了能够在图像上绘制的错觉。 但是,您实际上只是在透明覆盖上绘图。 …. … 帆布 然后我使用此代码创建我的Canvas ,并确保正确设置我的图层types。 public void setCanvas() { if(mFile != null && mFile.exists()) { mPictureBitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath()); mBitmap = Bitmap.createScaledBitmap(mPictureBitmap, mImageView.getWidth(), mImageView.getHeight(), false); mPictureBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888, true); mBitmap = mPictureBitmap.copy(Bitmap.Config.ARGB_8888, true); mSceneBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888, true); mBlurBitmap = blurImage(mPictureBitmap); mCanvas = new Canvas(mBitmap); […]

如何使用Android Canvas将图像从一个点移动到另一个点

我正在开发一款游戏,在这款游戏中,我必须将Canvas上的图像从一个点移动到另一个点,而不仅仅是垂直或水平。 如何以这种方式移动图像?