如何为 Android 自定义视图添加 OnClick 事件

2023-11-26

我有两个图像在屏幕上移动,一个是球,一个是人。 我想要发生的是,当用户触摸该人的图像时,球就会掉落。

我的问题是我似乎无法添加 onclick/ontouch 事件并使其正常工作。

我没有正确实施它,有人可以帮忙吗?

我已经包括了以下 3 类。格雷格是男人,球被命名为球:)

TestAnimationActivity.java

 package com.test.firstAnimation;

    import android.app.Activity;
    import android.os.Bundle;

    public class TestAnimationActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new MyAnimationView(this));
       }
    }

雪碧图.java

package com.test.firstAnimation;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class Sprite extends View implements OnClickListener{

     private static int gregCoordX = 410; // the x coordinate at the canvas for greg
     private Bitmap img; // the image of Greg
     private Bitmap img2; // the image of pointer 
     private static int gregCoordY = 125; // the y coordinate at the canvas for greg
     private static int pointCoordX = 10;
     private static int pointCoordY = 10;
     private static int count = 1;
     private static int ballSpeed = 25;
     private static boolean goingRight = false;
     private static boolean goingLeft = true;
     private static boolean pointerGoingRight = false;
     private static boolean pointerGoingLeft = true;


    public Sprite(Context context, int drawable) {

        super(context);

        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        img = BitmapFactory.decodeResource(context.getResources(), drawable);
        img2 = (BitmapFactory.decodeResource(context.getResources(), drawable));
        count++;
    }

    public static int getCount() {
        return count;
    }

    void setX(int newValue) {
        gregCoordX = newValue;
    }

    public static int getX() {
        return gregCoordX;
    }

    public static int getY() {
        return gregCoordY;
    }

    public static int getBX() {
        return pointCoordX;
    }

    public static int getBY() {
        return pointCoordY;
    }

    public Bitmap getBitmap() {
        return img;
    }

    public Bitmap getImg2() {
        return img2;
    }

    public static void dropBall()
    {
        pointCoordY++;
    }

    public static void moveBall(int x) {

           // check the borders
            //if more than ten go right
            //if ten go left
            //if more than 250 go left
            if (x <= 10 && pointerGoingLeft)
            {
            pointCoordX = pointCoordX + ballSpeed;
            pointerGoingRight = true;
            pointerGoingLeft = false;
            }
            else if (x >= 410 && pointerGoingRight)
            {
                pointCoordX = pointCoordX - ballSpeed;
                pointerGoingLeft = true;
                pointerGoingRight = false;
            }
            else if (pointerGoingRight)
                pointCoordX = pointCoordX + ballSpeed;
            else
                pointCoordX = pointCoordX - ballSpeed;

            if(MyAnimationView.ballDropping == true)
            {
                while (pointCoordY<gregCoordY)
                    dropBall();
            }
    }

    public static void moveGreg(int x) {

        if (x <= 10 && goingLeft)
        {
        gregCoordX = gregCoordX + count;
        goingRight = true;
        goingLeft = false;
        }
        else if (x >= 410 && goingRight)
        {
        gregCoordX = gregCoordX - count;
        goingLeft = true;
        goingRight = false;
        }
        else if (goingRight)
        gregCoordX = gregCoordX + count;
        else
        gregCoordX = gregCoordX - count;
}

    @Override
    public void onClick(View arg0) {
        dropBall();
    }
}

MyAnimationView.java

package com.test.firstAnimation;

import android.content.Context;
import android.graphics.Canvas;
import android.view.View;

public class MyAnimationView extends View{

    private Sprite greg;
    private Sprite ball;
    private int xCoOr;
    private int ballXCoOr;
    public static boolean ballDropping;

    public MyAnimationView(Context context) {
        super(context);

        ballDropping = false;
        greg = new Sprite(context,R.drawable.greg);
        ball = new Sprite(context, R.drawable.ball);

        OnClickListener gregClicked = new OnClickListener() {
            public void onClick(View v) {
            ballDropping = true;
            }
        };
        greg.setOnClickListener(gregClicked);
        }

    @Override protected void onDraw(Canvas canvas) {

     canvas.drawColor(0xFFFFFFFF);                                   //white background      

     ballXCoOr = Sprite.getBX();  
     xCoOr = Sprite.getX();
     Sprite.moveGreg(xCoOr);                                         //move ball left or right depending
     Sprite.moveBall(ballXCoOr);

     if(ballDropping == true)
     {
         Sprite.dropBall();
     }

     canvas.drawBitmap(greg.getBitmap(), xCoOr, Sprite.getY(), null);
     canvas.drawBitmap(ball.getBitmap(), ballXCoOr, Sprite.getBY(), null);
     invalidate();
     }
}

预先感谢,我已经被困了好几天了!

Ben


    float touched_x, touched_y;
    boolean touched = false;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        touchCounter++;
        touched_x = event.getX();
        touched_y = event.getY();

        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            touched = true;
            break;
        case MotionEvent.ACTION_MOVE:
            touched = true;
            break;
        case MotionEvent.ACTION_UP:
            touched = false;
            break;
        case MotionEvent.ACTION_CANCEL:
            touched = false;
            break;
        case MotionEvent.ACTION_OUTSIDE:
            touched = false;
            break;
        default:
        }
        return true; // processed
    }

Then;

    if (touched) {
        //control here
    }

Touched_x、Touched_y 是屏幕上单击的点的坐标。您可以比较格雷格的坐标和这些坐标。如果一样,那就做你想做的事吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 Android 自定义视图添加 OnClick 事件 的相关文章

  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 通过 ADB 拔出设备:“找不到服务”

    我必须测试我的应用程序在打瞌睡模式下的行为 根据文档 https developer android com training monitoring device state doze standby html testing doze 我
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐