标签: android-canvas

画布中的图像与触摸事件

看起来很简单,但我在实施方面遇到了问题.

我想要一个包含onTouch事件的屏幕上带有图像的画布.我试过ImageView但我无法使用画布.我已经尝试过SurfaceView并且能够在屏幕上显示画布,但我在运动onTouch事件(缩放,平移)时遇到问题.

我需要画布,因为我将在我的代码中渲染图像.

有人可以告诉我这样做的正确方法吗?

android image ontouchlistener android-canvas

20
推荐指数
1
解决办法
5万
查看次数

Canvas.clipPath(Path)未按预期剪切

我正在尝试将画布绘制操作剪切成弧形楔形.但是,在将剪切路径设置为画布后,我没有得到预期的结果.

为了说明,这是我正在做的事情:

在此输入图像描述

path.reset();

//Move to point #1
path.moveTo(rect.centerX(), rect.centerY());

//Per the documentation, this will draw a connecting line from the current
//position to the starting position of the arc (at 0 degrees), add the arc
//and my current position now lies at #2.
path.arcTo(rect, 0, -30);

//This should then close the path, finishing back at the center point (#3)
path.close();
Run Code Online (Sandbox Code Playgroud)

这是有效的,当我简单地绘制这个路径(canvas.drawPath(path, paint))时,它会绘制如上所示的楔形.但是,当我将此路径设置为画布的剪切路径并将其绘制到其中时:

//I've tried it with and without the Region.Op parameter
canvas.clipPath(path, Region.Op.REPLACE);
canvas.drawColor(Color.BLUE);
Run Code Online (Sandbox Code Playgroud)

我得到以下结果(仅留下楔形以显示参考):

在此输入图像描述

所以它似乎剪切到了它的边界矩形Path,而不是它 …

android drawing image-clipping android-canvas

19
推荐指数
1
解决办法
2万
查看次数

在Android上如何制作奇形怪状的剪裁区域?

以下是如何创建圆形的剪裁区域:

Path path = new Path();
path.addCircle(200,200,100,Direction.CW);
c.clipPath(path); // c is a Canvas
Run Code Online (Sandbox Code Playgroud)

现在Canvas上有一个剪裁区域,可以防止在该圆圈范围之外绘制任何东西.但是,如果我想将剪裁区域塑造成甜甜圈(或其他),该怎么办?

我尝试使用创建第二个Path并在其上使用toggleInverseFillType,然后将其添加到原始路径,但这似乎不起作用.

或者,不是使用Path,而是可以创建一个Bitmap用作蒙版,并以某种方式将其设置为Canvas上的剪贴蒙版?

编辑:答案正是我需要一个小的补充.在画布上执行多个操作时,请始终在第一个clipPath调用上使用Op.REPLACE.这将替换该Canvas上的任何现有clipPath.

作为参考,我在这里发现了6个不同的Region.Op值的含义.想象一下有2个圆圈的维恩图."B"是2个圆圈重叠的部分."A"是不重叠的左圆."C"是不重叠的右圆.

c.clipPath(a,Region.Op.REPLACE);
c.clipPath(b,???);

Region.Op.DIFFERENCE         -> A..            
Region.Op.INTERSECT          -> .B.            
Region.Op.REPLACE            -> .BC            
Region.Op.REVERSE_DIFFERENCE -> ..C            
Region.Op.UNION              -> ABC
Region.Op.XOR                -> A.C
Run Code Online (Sandbox Code Playgroud)

"." 表示未绘制的部分.对不起,如果不是特别清楚.没有图形很难很好地描述.

android dalvik masking android-canvas

18
推荐指数
1
解决办法
2万
查看次数

获取用于创建位图的imageview大小

我是一个有windows背景的程序员,我是Java和android的新手,

我想创建一个显示图表的小部件(不是应用程序).

经过长时间的研究,我知道我可以用Canvas,imageviews和Bitmaps做到这一点.

我绘制的画布应该与小部件大小相同.

所以问题是:我如何知道小部件大小(或图像视图大小),以便我可以将它提供给该功能

Bitmap.createBitmap(width_xx,height_yy,Config.ARGB_8888);

代码片段:在计时器运行方法中:

@Override
    public void run() {
        Bitmap bitmap = Bitmap.createBitmap(??, ??, Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        //create new paint  
        Paint p = new Paint();
        p.setAntiAlias(true);
        p.setStrokeWidth(1);

        //draw circle
        //here i can use the width and height to scale the circle
        canvas.drawCircle(50, 50, 7, p);
        remoteViews.setImageViewBitmap(R.id.imageView, bitmap);
Run Code Online (Sandbox Code Playgroud)

android android-widget android-imageview android-canvas

18
推荐指数
1
解决办法
3293
查看次数

Android:如何检查路径是否包含触摸点?

我会尝试开发一个可以绘制平面测量的应用程序.因此,每个房间都有自己的ID名称,如果我触摸房间,我想显示带有该ID或名称的Toast消息.问题是如何检查是否以及触及了哪条路径!!

我看到很多讨论这个问题的主题讨论.有人说使用getBounds方法,之后包含检查触摸点是否在Rect中的方法.但是,我猜getBounds方法返回包含路径的最小Rect,对吧?

因此,房间有不同的自定义几何形式,因此,如果我约束了2个关闭房间,方法可以返回一组共享点.坏!每个房间只有他们的面积点.我怎么解决这个问题 ?

在iOS中我可以使用PathContainsPoint方法,但不幸的是,Android Path没有类似的东西.

我希望有人可以提前帮助我

android contains path drawable android-canvas

18
推荐指数
2
解决办法
2万
查看次数

在android中查看onDraw(Canvas c)与draw(Canvas c)的对比?

我是Android开发的新手,我正在探索View.我遇到已知两种方法onDraw(Canvas c)draw(Canvas c).

请解释一下这两种方法的区别和用法?使用图像更新画布时,哪种方法可以提供更好的性能(FPS)?

android view android-canvas

18
推荐指数
3
解决办法
1万
查看次数

位图未绘制消除锯齿

我有一个习惯View,总是Bitmap在一定的轮换.我覆盖了该onDraw方法,旋转Canvas并使用消除锯齿绘制位图Paint.

public RotatedImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    someBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder);
}

@Override
protected void onDraw(Canvas canvas) {

    // Save and rotate canvas
    canvas.save();
    canvas.rotate(3F, getWidth() / 2, getHeight());

    // Draw the icon
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    canvas.drawBitmap(someBitmap, 0, 0, p);
    canvas.drawRoundRect(new RectF(75, 50, 225, 200), 10, 10, p);

    // All done; restore canvas
    canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

但是,我总是在Bitmap上出现锯齿状边缘.请注意,roudned矩形可以很好地消除锯齿边缘.此外,当我应用p.setFilterBitmap(true);此工作(位图表面被过滤/平滑)正确.我错过了什么吗?

照片上没有抗锯齿功能

这是一个最小的Android项目,其中一个屏幕的隔离示例显示了绘制从资源加载的非抗锯齿Bitmap的视图:https://bitbucket.org/erickok/antialiastest

更新: …

android android-custom-view android-canvas

18
推荐指数
3
解决办法
2万
查看次数

Android View.onDraw()总是有一个干净的画布

我想画一个动画.为此,我扩展了View并覆盖了onDraw()方法.我所期待的是每次调用onDraw()时画布都会处于我留下的状态,我可以选择清除它或者只是绘制它的一部分(这是我使用SurfaceView时的工作原理) )但每次画布回来时都已清除.有没有办法让我无法清除它?或者可能将以前的状态保存到位图中,这样我就可以绘制该位图然后在其上方绘制?

android android-ui android-canvas

17
推荐指数
1
解决办法
4万
查看次数

Android - 使用Flood-Fill时的Canvas Black

当我实施flood-fill课程时,它会变成我整个Bitmap黑色.显然这不是预期的效果.我查看了以下主题:

从我所看到的,我正在做他们在这些解决方案中提出的所有内容,但它并没有让我找到解决问题的方法.所以要切入追逐,这里的代码有一些简短的解释.

XML
我使用相对布局和定位(堆叠)两个ImageViews直接在彼此之上.它们都具有相同的图像,这就产生了能够在图像上绘制的错觉.但是,您实际上只是在透明覆盖上绘图.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    ....

    <ImageView
        android:id="@+id/drawContainer2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/imageMapperSurfaces"
        android:contentDescription="@string/image" />

    <ImageView
        android:id="@+id/drawContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/imageMapperSurfaces"
        android:contentDescription="@string/image" />

   ...
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

Canvas
然后我Canvas使用此代码创建我,并确保正确设置我的图层类型.

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);
        mImageView.setImageBitmap(mBitmap);
        mImageView2.setImageBitmap(mPictureBitmap); …
Run Code Online (Sandbox Code Playgroud)

android bitmap flood-fill imageview android-canvas

17
推荐指数
1
解决办法
813
查看次数

如何在android中制作完整的圆形图像视图

可能重复:
如何使图像适合android中的圆形框架

我想要一个360度圆形的Image View,我在stackoverflow上找到了相关的解决方案,但它们都在图像视图中产生了圆角.但我想要完整的圆形图像视图.

对于圆角图像视图链接是:

有什么想法吗.

android imageview android-layout android-canvas

16
推荐指数
1
解决办法
2万
查看次数