动态添加ImageView到View

2024-03-09

我正在制作一个使用 View 类的 Android 游戏,但我没有使用 XML 布局。

我所有的图像都是用画布绘制的。现在我的问题是我无法使用位图。

我正在尝试将 ImageView 动态添加到我的 View 类中,以使用可触摸事件。

为什么是动态的?因为我无法使用 XML 布局。
这是我的代码:

package com.example.poolmaster;

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    private int cuePosx, cuePosy;

    int cueHeight, cueWeight;
    double rotatingAngle;
    int height;
    int wwidth;
    int cueHeight2, cueWeight2;
    Bitmap table, stick, raise;

    ImageView button = new ImageView(this);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        rotatingAngle = 0;
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        height = displaymetrics.heightPixels;
        wwidth = displaymetrics.widthPixels;
        cueHeight2 = height / 2;
        cueWeight2 = wwidth / 2;
        System.out.println("**************************************");
        System.out.println("height " + height);
        System.out.println("weight" + wwidth);
        System.out.println("**************************************");
      
        // Set generic layout parameters
        GamePlay custom = new GamePlay(this);

        setContentView(custom);
       // setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_MOVE){
            // cuePosy += 10;
            // System.out.println("xCORDİNATES!!!! " +ev.getX());
            // System.out.println("yCORDİNATES!!!! " +ev.getY());
            rotatingAngle=getAngle(ev.getX(), ev.getY());
            System.out.println("Angle " +rotatingAngle);
        }
        if (ev.getAction()==MotionEvent.ACTION_DOWN){
            System.out.println("****************** ACTİON DOWN ****************");
            // cueHeight2 += 10;
            // cueWeight2 += 20;
            // cuePosy = 320;
        }
        if (ev.getAction()==MotionEvent.ACTION_UP){
            System.out.println("****************** ACTİON DOWN ****************");
            // cueHeight2 -= 10;
            // cueWeight2 -= 20;
            // cuePosy = 320;
        }
        return true;
    }
    private double getAngle(double xTouch, double yTouch) {
        double theta;
        
        theta = Math.toDegrees(Math.atan2(height / 2 - yTouch, xTouch - wwidth / 2));
        return theta;
    }
    
    public class GamePlay extends View {
        public GamePlay(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            table = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
            table = Bitmap.createScaledBitmap(table, wwidth, height, true);
            stick = BitmapFactory.decodeResource(getResources(), R.drawable.stick);

            raise = BitmapFactory.decodeResource(getResources(), R.drawable.raise);
            cueHeight = stick.getHeight();
            System.out.println("ıstaka " + cueHeight);
            cueWeight = stick.getWidth();
            cuePosx = wwidth / 2;
            cuePosy = height - cueHeight - 180;
        }
        @SuppressLint({ "DrawAllocation", "DrawAllocation" })
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            Matrix matrix = new Matrix();
            matrix.setTranslate(cueWeight2, cueHeight2);
            matrix.postRotate((float)rotatingAngle, cueWeight2, cueHeight2); // anti-clockwise by 90 degrees
               
            // create a new bitmap from the original using the matrix to transform the result
            Bitmap rotatedBitmap = Bitmap.createBitmap(stick, 0, 0, stick.getWidth(), stick.getHeight(), matrix, false);
               
            canvas.save(); // Save the position of the canvas.
            canvas.restore();
               
            // Rotate the canvas.
            canvas.drawBitmap(table, 0, 0, null); // Draw the ball on the rotated canvas.
            canvas.drawBitmap(stick, matrix, null);
            canvas.drawBitmap(raise, 0, 0, null);
            invalidate();
        }
    }
}

这是为了将 imageview 添加到扩展了 Activity 类的布局中

   LinearLayout lL = findViewById(R.id.xmlfile_layout_id);

   ImageView imgView = new ImageView(context); 

   imgView.setVisibility(View.VISIBLE);
   lL.addView(imgView);

这是为了将 imageview 添加到扩展了 View 类的画布中

最初,您无法使用画布放置任何图像视图、编辑文本或按钮。相反,你必须画它。因此,创建一个自定义布局并使用画布绘制该布局

试试这个,可能对你有帮助。在onDraw(..)

   LinearLayout lL = new LinearLayout(context);

   ImageView imgView = new ImageView(context); 

   imgView.setVisibility(View.VISIBLE);
   lL.addView(imgView);

    lL.measure(canvas.getWidth(), canvas.getHeight());
    lL.layout(0, 0, canvas.getWidth(), canvas.getHeight());

    // placing the edit text at specific co-ordinates:
    //canvas.translate(0, 0);
    layout.draw(canvas);

看看另一个例子:点击这里 http://www.kellbot.com/2009/06/android-hello-circle/

它提供了另一种添加视图的方式

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

动态添加ImageView到View 的相关文章

随机推荐

  • Vue.js / webpack 没有创建构建文件?

    这可能是一个愚蠢的问题 但到底是什么 我正在使用 vue cliwebpack simple模板 在该项目的 webpack 配置中我发现以下内容 output path path resolve dirname dist publicPa
  • 使“枚举时修改”集合成为线程安全的

    我想创建一个线程安全的集合 可以在枚举时进行修改 例子ActionSet类商店Action处理程序 它有Add方法将新的处理程序添加到列表中 并且Invoke枚举并调用所有收集的操作处理程序的方法 预期的工作场景包括非常频繁的枚举 并且在枚
  • Java dom4j org/jaxen/NamespaceContext 异常

    我已经下载了并将其添加到java的构建路径中 我也熟悉java lang NoClassDefFoundError org saxpath SAXPathException https stackoverflow com questions
  • 程序如何覆盖之前的输出行?

    程序如vim top or alsamixer输出多行文本并以某种方式操作已写入的文本行 我知道写 r字符到 stdout 这会将光标返回到行的开头 允许覆盖当前行 但不能覆盖之前的任何行 这些程序正在做什么才能拥有这些更高级的用户界面以及
  • 如何通过 DialogFragment 使用 startActivityForResult() ?

    我的应用程序需要添加用户名才能正常运行 mainActivity 在顶部显示从数据库检索的用户名 mainActivity 还有一个按钮 可通过 startActivityForResult 方法进入 addusername 活动 当用户实
  • Composer 缓存不适用于 bitbucket 管道构建

    我在我的 bitbucket 管道中得到了这个 pipelines branches develop step caches composer name unit tests Delivery image totersapp laravel
  • 为什么委托中所有方法都具有相同的名称?

    我从 Swift 开始 开发一个带有 tableView 的简单应用程序 对服务器的请求以及其他一些内容 我意识到 UITableViewDelegate 协议中的每个方法都以相同的方式命名 我猜它可能与其他协议相同 并且通过更改传递给这些
  • GCC 是否优化汇编源文件?

    我可以使用 GCC 将汇编代码文件转换为可重新分配的文件 gcc c source S o object o O2 优化选项是否有效 我可以期望 GCC 优化我的汇编代码吗 No GCC 将汇编源代码通过预处理器 然后传递到汇编器 任何时候
  • Java泛型通配符问题

    在使用 Google Guava 优秀的 Multimap 时 我遇到了一些泛型问题 我有一个这样定义的类型处理程序 public interface Handler
  • 从 ASP.net MVC 3 项目中删除默认 JavaScript 文件

    我刚刚开始使用 ASP net MVC 3 并且创建了一个空项目 我注意到脚本文件夹中填充了许多 JavaScript 文件 包括 jQuery 1 5 1 jQuery 用户界面 1 8 11 一些 jQuery 插件 ASP net M
  • 如何在Python中检查它是否是存档的文件或文件夹?

    我有一个存档 我不想提取它 但检查它的每个内容 无论它是文件还是目录 os path isdir 和 os path isfile 不起作用 因为我正在处理存档 存档可以是 tar bz2 zip 或 tar gz 中的任何一个 所以我不能
  • 捕获未通过 QuickFix 验证的传入 FIX 消息

    A Quickfix http www quickfixengine org 客户端使用以下方法验证传入消息XML 规范文件 http www quickfixengine org documentation 如果消息验证失败 quickf
  • 将数据从 UITableViewCell 推送到 UINavigationController

    我有一个 UISearchDisplaycontroller 我必须将信息推送到文本字段 并需要将其链接到导航视图控制器 这是我的代码 void prepareForSegue UIStoryboardSegue segue sender
  • 具有 ADT 和 Aux 模式的类型安全

    我正在使用 ADT 和 Aux 模式设计类型安全代码 并且无法摆脱一些asInstanceOf 这是示例 sealed trait Source case object FileSystem extends Source case obje
  • 如何限制 Phusion Passenger 内存使用?

    有没有办法限制 Phusion Passenger 在提供您的应用程序时使用的内存量 在我获得大量流量后 我的主机过来并终止了该进程 因此我最终提供了空白页面 我能做些什么来表达 嘿 不要使用超过 100Mb 的内存 并且无论网站有多超载
  • 在 Rails 中的多个数据库之间切换而不破坏事务

    我正在设置一个包含多个数据库的 Rails 应用程序 它用ActiveRecord Base establish connection db config在数据库之间切换 所有数据库都在database yml中配置 establish c
  • Arrays.stream().map().sum() 性能不稳定

    我偶然发现了一个对原始数组进行非常简单的映射 归约操作的性能曲线极其不稳定的实例 这是我的 jmh 基准代码 OutputTimeUnit TimeUnit NANOSECONDS BenchmarkMode Mode AverageTim
  • 如何在按钮单击时显示文本区域?

  • 使用python删除html标签?

    我知道可能有一百万个问题 但我想知道如何删除这些标签 而无需导入或使用 HTMLParser 或正则表达式 我尝试了一堆不同的替换语句来尝试删除 包含的部分字符串 但无济于事 基本上我正在处理的是 response urlopen url
  • 动态添加ImageView到View

    我正在制作一个使用 View 类的 Android 游戏 但我没有使用 XML 布局 我所有的图像都是用画布绘制的 现在我的问题是我无法使用位图 我正在尝试将 ImageView 动态添加到我的 View 类中 以使用可触摸事件 为什么是动