Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 画布绘制:无法使用运行时生成的位图图像渲染动画_Android_Android Ndk_Android Canvas - Fatal编程技术网

Android 画布绘制:无法使用运行时生成的位图图像渲染动画

Android 画布绘制:无法使用运行时生成的位图图像渲染动画,android,android-ndk,android-canvas,Android,Android Ndk,Android Canvas,这里需要一点帮助:我现在没有主意了 以下是我需要做的: 渲染“基本”图像[它是从ARGB.8888字节数组创建的] 用户在屏幕上点击2点;我需要在从一点到另一点的路径周围的像素区域上执行像素操作。。。[我需要为整个路径上的每个像素计算一个像素的平方块] 以动画形式显示代码进行时对图像的修改 我能够显示整个路径;我能够正确计算和操作像素。。但我不能做的是显示动画,因为我的代码正在路径上进行。。。使用当前的实现,我能够在最后显示整个计算路径 public void onDraw(Canvas c

这里需要一点帮助:我现在没有主意了

以下是我需要做的:

  • 渲染“基本”图像[它是从ARGB.8888字节数组创建的]
  • 用户在屏幕上点击2点;我需要在从一点到另一点的路径周围的像素区域上执行像素操作。。。[我需要为整个路径上的每个像素计算一个像素的平方块]
  • 以动画形式显示代码进行时对图像的修改
我能够显示整个路径;我能够正确计算和操作像素。。但我不能做的是显示动画,因为我的代码正在路径上进行。。。使用当前的实现,我能够在最后显示整个计算路径

public void onDraw(Canvas canvas){

canvas.drawColor(Color.WHITE);
Paint p = new Paint();
canvas.drawBitmap(base,0,0,p);

traverse clickEvent1.x -> clickEvent2.x
      traverse for clickEvent1.Y -> clickEvent2.Y
           {
           newBitMap = calculateNewBitMap(base)

           // I nee to redraw Canvas with (newBitMap)
           // canvas.drawBitMap(newBitMap);

            //Doesn't work
            //postInvalidate();
            //invalidate()

            //AnimationDrawable.addFrame(newBitMap)

            // I am not calling start here 
            //but just wanted to let you know that I do call animation start to display the frames stored in it
            // animation.start();
           }

// obviously wouldn't work here As it is already out of the loop
//invalidate();
}
请注意:

  • newBitMap映像是在运行时生成的,它在运行之前对我不可用
  • 我也在循环中尝试了invalidate();但它只会在整个循环遍历之后绘制累积结果,而不会绘制newBitMaps的中间状态
  • 性能至关重要+我正在处理巨大的图像大小。。所以请记住这一点。。。如果我创建多个位图用于临时存储JVM,那么JVM会因“OutofMemory”而崩溃
  • 我也尝试过以“AnimationDrawable”的形式存储新图像;但这也不能解决问题

    AnimationDrawable animDrawable = new AnimationDrawable();
    Drawable frame1 = new BitmapDrawable(newCaclBitMap);
    animDrawable.addFrame(frame1, 250);
    

  • 感谢您的指点/建议。

    动画
    对象用于设置
    视图
    对象的动画。您要做的是为画布设置动画。这更复杂,但可能更强大。从本质上讲,您需要导出一个方程式,该方程式将控制图形的运动,并将其作为时间的函数。当动画开始时,您将获得当前时间戳,然后在
    onDraw
    方法中绘制画布在该时间点的外观。基本上,你必须绘制每一步。

    你所做的似乎是在一次调用
    onDraw()
    中运行所有的绘制逻辑,而我认为你想要的是为动画的每一帧调用一次
    onDraw()

    因此,不要在跟踪中使用类似的内容:

    onDraw()
      drawFrame()
      drawFrame()
      drawFrame()
      ...
    
    你可以这样做:

    onDraw()
      drawFrame()
    onDraw()
      drawFrame()
    onDraw()
      drawFrame()
    ...
    

    有一个这样的例子。

    谢谢你给我指点立方墙纸。。。我在“LunarLander”和“CubeliveWallper”实现中解决了这个问题