标签: android-canvas

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

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

如何以这种方式移动图像?

java android android-canvas

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

加载没有OutOfMemoryError的大图像

我有一个5000 x 4000 px图像,我想画在画布上.

首先,我尝试从资源加载它.我把它放进去了/res/drawable.

我使用以下方法:

InputStream input = getResources().openRawResource(R.drawable.huge_image);
Drawable d = Drawable.createFromStream(input, "image");
d.setBounds(...);
d.draw(canvas);
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.

在这种情况下,InputStream是一个AssetManager.AssetInputStream.

所以现在我想从SD卡加载它.

这是我试图做的事情:

File f = new File(path);
Uri uri = Uri.fromFile(f);
InputStream input = mContext.getContentResolver().openInputStream(uri);
Drawable d = Drawable.createFromStream(input, "image");
Run Code Online (Sandbox Code Playgroud)

在这种情况下InputStream是a FileInputStream,我OutOfMemoryError在创建时得到了Drawable.

所以我想知道:

有没有办法加载图像而不会出现错误?或者有没有办法将a转换FileInputStreamAssetInputStream

注意:

我不想调整图像大小,因为我正在实现缩放/平移功能.请不要告诉我阅读有效加载大位图.

你可以在这里查看全班.使用时发生错误setImageUri().

这是我的错误日志:

08-13 11:57:54.180: E/AndroidRuntime(23763): FATAL EXCEPTION: main
08-13 11:57:54.180: E/AndroidRuntime(23763): java.lang.OutOfMemoryError: …
Run Code Online (Sandbox Code Playgroud)

java android android-image android-canvas

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

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

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

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

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

有什么想法吗.

android imageview android-layout android-canvas

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

当立方贝塞尔曲线中的端点变化时找到新的控制点

我在我的Android应用程序中实现了三次贝塞尔曲线逻辑.

我在自定义视图的onDraw上在画布上实现了三次贝塞尔曲线代码.

// Path to draw cubic bezier curve
Path cubePath = new Path();

// Move to startPoint(200,200) (P0)
cubePath.moveTo(200,200);

// Cubic to with ControlPoint1(200,100) (C1), ControlPoint2(300,100) (C2) , EndPoint(300,200) (P1)
cubePath.cubicTo(200,100,300,100,300,200);

// Draw on Canvas
canvas.drawPath(cubePath, paint);
Run Code Online (Sandbox Code Playgroud)

我在下面的图像中可视化上面的代码.

输出上述代码

[更新]

Logic for selecting first control points, I've taken ,
baseX = 200 , baseY = 200 and curve_size = X of Endpoint - X of Start Point

Start Point     : x = baseX and y = baseY
Control Point 1 …
Run Code Online (Sandbox Code Playgroud)

android bezier cubic android-canvas

16
推荐指数
3
解决办法
3354
查看次数

Android Canvas清晰透明

我试图从画布上"擦除".就像清理画布的非常简单的测试一样,我实现了以下内容:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.argb(140, 0, 0, 0));
    canvas.drawColor(0, Mode.CLEAR);
}
Run Code Online (Sandbox Code Playgroud)

Color.argb(140, 0, 0, 0)设置此视图被绘制的视图以使其变暗. drawColor(0, Mode.CLEAR)使屏幕完全变黑,而不是删除之前应用的调光. 这个想法来自这里

android android-custom-view android-canvas

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

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

我有一个Android的绘图应用程序,我目前正在尝试添加一个真正的橡皮擦.在此之前,我刚刚使用白色涂料作为橡皮擦,但现在我不再使用背景颜色和图像了.我通过透明画布下方的图像视图来完成此操作.

我面临的问题是每当我启用我的橡皮擦时,它会在我用手指向下时画出一条坚实的黑色痕迹,但是一旦我释放它就会变成透明的.请参见下面的屏幕截图:

这是我的手指在屏幕上时的样子 - 一条坚实的黑色小道 当我的手指仍然在屏幕上时,它看起来如何

这是我从屏幕上移开手指后的样子 一旦我放手,它看起来如何

所以,我似乎越来越接近了,但是当我的手指在擦除时触摸时,我无法找到正确的设置组合以避免黑色痕迹.以下是一些相关的代码片段:

的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);
}
Run Code Online (Sandbox Code Playgroud)

的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, currentY);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touchUp(currentX, currentY);
            invalidate();
            break;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

当前尝试橡皮擦设置

public void startEraser() {
    mPaint.setAlpha(0);
    mColor = Color.TRANSPARENT;
    mPaint.setColor(Color.TRANSPARENT);
    mPaint.setStrokeWidth(mBrushSize);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setMaskFilter(null);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    mPaint.setAntiAlias(true); …
Run Code Online (Sandbox Code Playgroud)

android android-canvas eraser

16
推荐指数
3
解决办法
8155
查看次数

有限项目的无限卷轴

我有一个GridView5x50内的物品.

我需要向所有方向滚动它们,而不是在到达终点时停止,只是从顶部/左侧开始.

例如从左到右滚动

在滚动之前

1 2 3 4 5
6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

滚动到右边后

5 1 2 3 4
10 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

从上到下(或从下到上)

在滚动到底部之前

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)

滚动后

6 7 8 9 10
11 12 13 14 15
1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

我试着让它像GridView原生卷轴一样平滑滚动.

android android-layout android-gridview android-canvas android-view

16
推荐指数
3
解决办法
922
查看次数

获取Android视图上包含支持Bitmap的Canvas的点的像素颜色值

我试图找出在视图上给定点获取像素颜色值的最佳方法.我有三种方式写入视图:

  1. 我用View.setBackgroundDrawable(...)设置了一个背景图像.

  2. 我使用Canvas.drawText(...),Canvas.drawLine(...)等将文本,绘制线等写入支持Bitmap的Canvas.

  3. 我通过将子对象(sprite)写入传递给View的onDraw(Canvas画布)方法的Canvas来绘制子对象(精灵).

这是我的类中的onDraw()方法,它扩展了View:

   @Override
   public void onDraw(Canvas canvas) {
      // 1. Redraw the background image.
      super.onDraw(canvas);
      // 2. Redraw any text, lines, etc.
      canvas.drawBitmap(bitmap, 0, 0, null);
      // 3. Redraw the sprites.
      for (Sprite sprite : sprites) {
        sprite.onDraw(canvas);
      }
    }
Run Code Online (Sandbox Code Playgroud)

获得像素的颜色值以考虑所有这些来源的最佳方法是什么?

graphics android view android-canvas

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

Android动态壁纸 - OpenGL与Canvas

我是一个相当"新手"的Android开发人员,我希望我的第一个项目之一是一个动态壁纸,但是我是否应该关注Canvas或OpenGL是否存在冲突.作为新手,我知道我应该首先掌握Canvas,因为它更容易使用,但我更喜欢从我感兴趣的现实世界项目中学习,即使它有时有点倒退.

我之前以非常基本的方式使用过这两种方式,并且我理解它们的一般概念,但我不确定它们如何转移到动态壁纸的领域.我认为在动态壁纸上不需要OpenGL的全速运行,因为以最大FPS运行它会比电池耗尽更多,但与此同时我担心使用Canvas会导致滞后和在做更换主屏幕等事情时会口吃.

我一直倾向于使用OpenGL ES 2.0,以保持性能最佳,因为我对壁纸的初步想法涉及很多分层,我不确定Canvas是否有能力,但我希望更有经验的开发人员对是否有意见或者不是所有涉及使用OpenGL的额外工作(特别是与我看过的动态壁纸有关)是值得的.

android opengl-es live-wallpaper android-canvas

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

Android - 从WebView绘制到PDF画布

我一直在Android上进行PDF打印工作时遇到麻烦.我要做的是在WebView中渲染一些HTML,然后在PDF画布上绘制WebView内容,最后将PDF写入文件.我遇到的问题是,当我绘制到PDF画布时,即使有足够的画布,内容也会被剪裁.我已经尝试使用这种工具来调整画布大小,.clipRect(Rect rect, Op op)但这种工作并不像我喜欢的那样好.

我也不知道如何将HTML px测量值可靠地转换为PDF PostScript 1/72英寸测量值.

这是我正在使用的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) this.findViewById(R.id.webView1);

    wv.loadUrl("file:///android_asset/temp.html");           
}

public void button1onClick(View v)
{
    //Create PDF document
    PdfDocument doc = new PdfDocument();

    //Create A4 sized PDF page
    PageInfo pageInfo = new PageInfo.Builder(595,842,1).create();

    Page page = doc.startPage(pageInfo);

    WebView wv = (WebView) this.findViewById(R.id.webView1);

    page.getCanvas().setDensity(200);

    //Draw the webview to the canvas
    wv.draw(page.getCanvas());

    doc.finishPage(page);

    try
    {
        //Create the PDF file
        File root = Environment.getExternalStorageDirectory();          
        File file = …
Run Code Online (Sandbox Code Playgroud)

pdf android webview android-canvas

15
推荐指数
1
解决办法
5398
查看次数