android中的自定义对象单击问题

android中的自定义对象单击问题,android,click,effect,Android,Click,Effect,我已经在android中创建了一个自定义视图来在屏幕上显示球。现在我想要的是,当我触球时,它会爆炸成四个部分,每个部分都会朝着不同的四个方向移动,即上、下、左、右。我知道我必须设置触控监听器来检测球上的触控,但是如何创建爆炸效果呢?这个问题现在已经解决了。我在屏幕上显示了多个球,这样用户就可以点击它并将其爆炸 以下是我的自定义视图: public class BallView extends View { private float x; private float y;

我已经在android中创建了一个自定义视图来在屏幕上显示球。现在我想要的是,当我触球时,它会爆炸成四个部分,每个部分都会朝着不同的四个方向移动,即上、下、左、右。我知道我必须设置触控监听器来检测球上的触控,但是如何创建爆炸效果呢?这个问题现在已经解决了。我在屏幕上显示了多个球,这样用户就可以点击它并将其爆炸

以下是我的自定义视图:

public class BallView extends View {
    private float x;
    private float y;
    private final int r;
    public BallView(Context context, float x1, float y1, int r) {
        super(context);
        this.x = x1;
        this.y = y1;
        this.r = r;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(x, y, r, mPaint);
    }

}
具有类似特性的小球,除了一个为“方向”的小球和一个沿方向移动的“分解”方法以及停止移动的“动画”标志

private final int direction;
private boolean anim;

public void explode() {
    // plus or minus x/y based on direction and stop animation if anim flag is false
    invalidate();
}
我的布局xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/main_view"
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:background="#FF66FF33" />
final FrameLayout mainFrameLayout = (FrameLayout) findViewById(R.id.main_frame_layout);

SmallBall[] smallBalls = new SmallBall[4];
smallBalls[0] = new SmallBall(getApplicationContext(), 105, 100, 10, 1, false);
smallBalls[0].setVisibility(View.GONE);
mainFrameLayout .addView(smallBalls[0]);
// create and add other 3 balls with different directions.

BallView ball = new BallView(getApplicationContext(), 100, 100, 25, smallBalls);
listener = new MyListener(ball);
ball.setOnClickListener(listener);

mainFrameLayout.addView(ball);
我在不同的位置添加了多个BallView和它们的相对小球数组。现在,无论我点击屏幕上最后一个添加的BallView的位置,都会发生什么事情。在那最后一秒之后,等等。因此,这里有两个问题:

  • 为什么不管我在屏幕上单击什么位置,它都会调用onClick/onTouch事件?它应该只在我点击特定的BallView时调用listener事件
  • 第二个问题是为什么BallView开始以与添加到布局中的方式相反的方式爆炸
  • 我的侦听器类:

    public void onClick(View v) {
            BallView ballView = (BallView) v;
            ballView.setVisibility(View.GONE);
            //get small balls associated with this ball.
            //loop through small ball and call their explode method.
        }
    

    由于字符限制,我已经对代码进行了裁剪。

    我认为您不需要在画布中硬编码所有这些内容。您可以在Touch Listener中调用
    ball.setVisibility(View.GONE)
    ,并使用
    smallBall.setVisibility(View.Visible)
    为每个小球显示4个额外的球。这样你就可以隐藏大球,也可以展示小球。 现在对于移动效果,在每个小球中都可以有一个方法来传递方向,你可以像这个小球一样调用它。explode(direction)。方法实现可以是

    explode(int direction){//can be String
      if(direction=NORTH)
         y--;
      //other condition checks
    }
    
    “分解”方法将根据传递的方向开始更改其x和y坐标。
    我希望这会给你一个关于如何实现它的提示。

    这一切都发生了,因为你没有指定Ball对象的LayoutParameters。这里发生的事情是,当你们把一个球对象添加到布局中时,它占据了整个布局的空间,这就是为什么它会对点击屏幕上的任何地方做出反应

    至于第二个问题,原因是一样的。假设板块的情况,它总是以后进先出的方式弹出。这里所有的球都覆盖整个屏幕,所以把它们看成是平板,所以你所做的就是把盘子放在上面。这就是为什么它会首先对最后一个球的onClick方法做出反应,然后是倒数第二个球,依此类推


    因此,在为球对象设置适当的布局参数后,这两个问题都会得到解决。

    好的,问题是在创建
    BallView
    SmalBall
    as
    View
    对象的过程中出现的。我想我可以很好地解释这一点,所以请耐心听我说:

    一个好的开始是分层蛋糕。想象一下站在厨房里做一个蛋糕,就像这样:一次加一层。首先是巧克力层,然后是香草层,然后是另一层巧克力。听起来不错吧?好的

    因此,在
    Canvas
    上绘制了许多圆圈,分别将
    Ball
    对象添加为
    View
    s。注意:画布仅表示用户可以与之交互的矩形,并与代码中的
    框架布局
    视图相关联。出于所有意图和目的,
    画布
    正在完全填充
    框架布局
    。在你的应用程序中,
    Canvas
    是蛋糕的底层——填充
    ContentView
    (或pan)的宽度和高度

    m.addView(View v)
    的每次调用本质上都是在
    m
    中已经包含了许多
    View
    对象的基础上添加一个新的
    View v
    。就蛋糕而言,每次调用
    addView
    都会给我们的蛋糕添加另一层

    在您的项目中,您希望在蛋糕上添加一层,但不要让它填满整个平底锅。你想在上面放两个草莓,你不想要一整层草莓

    因此,默认情况下,
    BallView
    对象占据整个屏幕。每一块都堆在另一块上面,填满了整个画布。当你点击时,它会删除最后一个——因为最后一个在顶部,占据了整个画布的宽度和高度——实际上是用户可以点击的唯一一个球

    因此,您必须告诉您的
    BallView
    View
    对象与您在
    画布上绘制的圆大小相同

    因此,这里有几个问题:

    您只能使用
    RelativeLayout
    进行绝对定位。如果您希望
    球视图
    用户可以单击以位于画布上绘制的圆的顶部,则需要一种方法来告知
    球视图
    的位置,并动态更改该位置。当前您使用的是
    框架布局
    ,这是
    画布
    所必需的,因此在XML中添加一个全屏
    。然后,在代码中,将
    BallView
    对象添加到此
    RelativeLayout

    然后,最后:

    到这里:


    祝你好运

    你在编码爆炸效果时遇到了什么问题?您想要零件运动的动画还是爆炸图形?如果你能提供一张图片或一些你想要实现的东西,那就更好了。@Creator:我想要的是,当有人点击任何一个球时,它会爆炸成四个小球,每面墙都会朝四个方向中的一个方向移动。我不确定该用什么,因为我对安卓系统还不熟悉。可能是动画的爆炸部分将是一个很好的选择。谢谢。我会尝试这个,让你知道。如何调用爆炸反复,使小球移动?还有一件事,我正在向FrameLayout添加球,现在如何添加小球