Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.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_Animation_Canvas - Fatal编程技术网

带点击的android按钮动画

带点击的android按钮动画,android,animation,canvas,Android,Animation,Canvas,我试着制作飞行的气球(上下,无限),点击其中一个,它就会改变方向。我尝试使用动画,但它不支持在当前时间单击当前位置的视图。我知道,至少有两种方法: 使用OpenGL 并使用画布 我不想使用OpenGL制作简单的动画。我不知道如何使用Canvas(被阅读、谷歌文档和一些谷歌搜索链接)来实现这一点。 我不需要代码,我只需要它的方法和算法。好的,这是我为我的一个项目设置的,它将完全按照您的需要工作 您需要创建4个主要方面: -活动(扩展活动) -SurfaceView(扩展SurfaceView实

我试着制作飞行的气球(上下,无限),点击其中一个,它就会改变方向。我尝试使用动画,但它不支持在当前时间单击当前位置的视图。我知道,至少有两种方法:

  • 使用OpenGL
  • 并使用画布
我不想使用OpenGL制作简单的动画。我不知道如何使用Canvas(被阅读、谷歌文档和一些谷歌搜索链接)来实现这一点。
我不需要代码,我只需要它的方法和算法。

好的,这是我为我的一个项目设置的,它将完全按照您的需要工作

您需要创建4个主要方面:
-活动(扩展活动)
-SurfaceView(扩展SurfaceView实现SurfaceHolder.Callback)
-线程(扩展线程)
-交互对象(扩展可绘制)

该活动将启动并生成创建线程的SurfaceView。视图或线程可以包含您绘制/与之交互的对象,这取决于您此时希望如何存储数据,但如果您提出类之间耦合最少的设计,则最简单

一旦启动,线程将持续运行直到停止(将
isRunning
设置为false):

在这个类中,您可以看到
update()
方法,它在线程的每次迭代中执行一系列操作

您最感兴趣的方法是
handleInput
updateUI
updatePhysics
方法

handleInput
中,您将回调SurfaceView以获取处理信息所需的数据。我的
handleInput
相当简单,因为它只从SurfaceView类的
onTouchEvent
中获取
MotionEvent
(这在使用SurfaceHolder.OnCallBack接口时实现)

updateUI
方法调用SurfaceView的
update
,在那里它用每个对象或气球重新绘制画布

public void update(List<Actor> actors) {
        Canvas canvas = null;       
        try {
            canvas = surface.lockCanvas();
            synchronized (surface) {
                //Blank the Canvas

                for (int i = 0; i < actors.size(); i++) {   
                    actors.get(i).draw(canvas);
                }
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
                surface.unlockCanvasAndPost(canvas);
            }
        }   
    }
公共作废更新(列出参与者){
Canvas=null;
试一试{
canvas=surface.lockCanvas();
同步(表面){
//填空画布
对于(inti=0;i
这里我们可以看到,它调用了
draw
方法,将画布对象传递给每个可交互对象。我在上面的代码中称我的“演员”。如何选择实现
draw
取决于您,但听起来您将使用许多
canvas.drawBitmap()
函数

回到线程的
updatePhysics
方法,您希望在对象被绘制到屏幕之前或之后使用它来更新对象。对于你来说,你需要让他们改变他们在屏幕上的X和/或Y位置,或者在
handleInput
确定你击中气球后改变其移动方向


很难在回答中解释清楚这一点。如果你真的想要,我可以尝试在这个周末把一些更具信息性的东西放在一起,并在外部发布给你(我可以提供我的UML类图以及其他信息,比如图片示例、结构和数据流)


请让我知道我是否可以进一步帮助您!请注意,这并不是我全部的工作。我使用了很多关于基本Android游戏结构的在线教程,但目前没有提供参考的链接。

我现在没有时间写完整的解释,但谷歌提供了Android游戏教程。您需要创建一个线程,该线程在气球对象上执行更新命令,然后让它们调用画布上的绘制命令。这些教程有很多,它们应该可以帮助您。我可以稍后发布我的项目中的代码,这些代码使用了您以后需要的大量工作。好的。我非常感谢您提供一些代码
public void update(List<Actor> actors) {
        Canvas canvas = null;       
        try {
            canvas = surface.lockCanvas();
            synchronized (surface) {
                //Blank the Canvas

                for (int i = 0; i < actors.size(); i++) {   
                    actors.get(i).draw(canvas);
                }
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
                surface.unlockCanvasAndPost(canvas);
            }
        }   
    }