如何在android中以编程方式绘制下面的图像?

2024-02-12

我是安卓新手。我发现使用画布非常困难。如何在android中绘制下面的图像?我还想让选定的字母在触摸时突出显示。


这里是:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="64dp"
        android:background="#000">
        <!-- Main area -->
    </FrameLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="64dp"
        android:layout_gravity="center_horizontal"
        android:orientation="horizontal">

        <View
            android:id="@+id/a"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#f00"/>

        <View
            android:id="@+id/b"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#0f0"/>

        <View
            android:id="@+id/c"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#00f"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="64dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|right"
        android:orientation="vertical">

        <View
            android:id="@+id/d"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#ff0"/>

        <View
            android:id="@+id/e"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#0ff"/>

        <View
            android:id="@+id/f"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#f0f"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="64dp"
        android:layout_gravity="center_horizontal|bottom"
        android:orientation="horizontal">

        <View
            android:id="@+id/g"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#900"/>

        <View
            android:id="@+id/h"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#090"/>

        <View
            android:id="@+id/i"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#009"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="64dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:orientation="vertical">

        <View
            android:id="@+id/l"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#990"/>

        <View
            android:id="@+id/k"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#099"/>

        <View
            android:id="@+id/j"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:background="#909"/>

    </LinearLayout>

</FrameLayout>

EDITED

您还可以借助画布在一个视图中执行此操作:

public class GameView extends View {
    private final int[] colors = {
            0xffff0000, 0xff00ff00, 0xff0000ff,
            0xffffff00, 0xff00ffff, 0xffff00ff,
            0xff990000, 0xff009900, 0xff000099,
            0xff999900, 0xff009999, 0xff990099};

    private final Paint[] paints = new Paint[colors.length];
    private Paint mainAreaPaint = new Paint();

    private RectF mainAreaRect;

    public GameView(Context context) {
        super(context);
        init();
    }

    public GameView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public GameView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public GameView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float squareSize = Math.min(getWidth(), getHeight()) / 7;

        //draw main area
        canvas.drawRect(new RectF(squareSize, squareSize, 6 * squareSize, 6 * squareSize), mainAreaPaint);

        //draw top squares
        canvas.drawRect(new RectF(2 * squareSize, 0, 3 * squareSize, squareSize), paints[0]);
        canvas.drawRect(new RectF(3 * squareSize, 0, 4 * squareSize, squareSize), paints[1]);
        canvas.drawRect(new RectF(4 * squareSize, 0, 5 * squareSize, squareSize), paints[2]);

        //draw right squares
        canvas.drawRect(new RectF(6 * squareSize, 2 * squareSize, 7 * squareSize, 3 * squareSize), paints[3]);
        canvas.drawRect(new RectF(6 * squareSize, 3 * squareSize, 7 * squareSize, 4 * squareSize), paints[4]);
        canvas.drawRect(new RectF(6 * squareSize, 4 * squareSize, 7 * squareSize, 5 * squareSize), paints[5]);

        //draw bottom squares
        canvas.drawRect(new RectF(4 * squareSize, 6 * squareSize, 5 * squareSize, 7 * squareSize), paints[6]);
        canvas.drawRect(new RectF(3 * squareSize, 6 * squareSize, 4 * squareSize, 7 * squareSize), paints[7]);
        canvas.drawRect(new RectF(2 * squareSize, 6 * squareSize, 3 * squareSize, 7 * squareSize), paints[8]);

        //draw left squares
        canvas.drawRect(new RectF(0, 4 * squareSize, squareSize, 5 * squareSize), paints[9]);
        canvas.drawRect(new RectF(0, 3 * squareSize, squareSize, 4 * squareSize), paints[10]);
        canvas.drawRect(new RectF(0, 2 * squareSize, squareSize, 3 * squareSize), paints[11]);
    }

    private void init() {
        for(int i = 0; i < colors.length; i++) {
            paints[i] = initPaint(colors[i]);
        }

        mainAreaPaint = initPaint(0xff000000);
    }

    private Paint initPaint(int color) {
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(color);
        paint.setStyle(Paint.Style.FILL);
        return paint;
    }
}

对于性能不佳的代码,我们深表歉意。当然,您需要将 Rects 的所有初始化放在 onMeasure 方法中,并正确处理像 minHeight 和 e.t.c 这样的 andoird xml 属性。此外,您还可以在视图内编写绘制的绘画的正确位置(在中心、在角落等),但我只是写了一个示例来抓住要点。这是屏幕截图,我们最终得到的是:

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

如何在android中以编程方式绘制下面的图像? 的相关文章

随机推荐

  • Android 5.0+ AudioManager setMode 不起作用

    我正在开发 AudioManager 它是一个 Android SystemService 在 Android 系统 5 0 中 我遇到了 AudioManager 的 setMode 方法不起作用的问题 我通过测试 Android M L
  • unicode“感知”std::getline

    好吧 我正在测试如何编写一个 C 应用程序 该应用程序实际上可以读取 和更改 文本文件 同时尊重文本使用的编码 我希望 对于其他 API 将所有读取的文本显式转换为 UTF 8 以供内部使用 与文件中的实际编码无关 我在 Windows 上
  • .net 本地程序集加载因 CAS 策略失败

    我们收到以下程序集加载错误 该程序集是从本地路径 C Program Files ASWorx Products ASWorx Bin 加载的 旧版本的二进制文件不存在问题 当我们通过电子邮件发送新的二进制文件时 就会出现此问题 构建设置未
  • Alpha 通道(PNG) 和 Golang 的问题

    我在 golang 中的图像遇到一个简单的问题 我正在用颜色绘制 png 图像 但结果不是我想要的 在 Alpha 值最低的像素中 绘制另一种颜色 我正在使用 alphaChannel false return new image with
  • Android 12 kiosk 模式 - 屏幕超时后 NFC 停止工作

    我有一些使用 Android Management API 并在 kiosk 模式下运行的设备 从 Android 10 gt Android 12 升级后 我遇到了有关 NFC 扫描的新问题 设备重新启动后 一切似乎工作正常 如果我通过按
  • Javascript:将 HTML 中的行动态添加到 IE 中的表格时出现问题

    我查看了其他一些问题 例如this one https stackoverflow com questions 812693 cant dynamically add rows to a table in ie但他们没有解决这个特定问题 当
  • Erlang/OTP 架构:SOAish 服务的 RESTful 协议

    让我们想象一下 我们有一个为披萨店设计和构建的订单处理系统 要求是 R1 系统应该与客户端和用例无关 这意味着系统可以由初始设计期间未考虑到的客户端访问 例如 如果披萨店决定其许多顾客稍后使用三星 Bada 智能手机 那么为 Bada OS
  • 更改纯 ruby​​ 中的时区(不是 Rails)

    我正在构建一个 Sinatra 站点 该站点具有混合 UTC PST 数据源 但将在 PST 中查看 所以我需要一种方法来轻松地将 Time 对象从 UTC 转换为 PST 没有 Rails 我无法访问Time zone in time z
  • 如何将值插入到MYSQL中的自动标识列中[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想将值插入 mysql innod
  • Firebase 功能会话 Cookie 未在子域上定义

    我尝试让 Firebase 会话 Cookie 工作以在所有子域中保留一个身份验证 现在我有了子域名accounts mysite com我将云功能以及登录表单路由到其中 在那里注册后 我调用我的云功能 app get authentica
  • 使用 gnuplot 绘制轨迹

    我有一个数据文件 其移动点的位置采用以下格式 x1 y1 x2 y2 x3 y3 我希望在 gnuplot 中使用这些数据制作动画轨迹 我怎样才能做到这一点 我试过 do for i 1 20 plot temp dat every i u
  • Android 如何停止其他Activity中的AlarmManager

    我正在使用一个在 AlarmManager 重复创建的活动 A 中调用的服务 我的服务正在重复检查服务器的响应 当响应为 true 时 新的 Activity B 就会启动 现在 当活动 B 启动时 我想停止服务以及 AlarmManage
  • 实体框架代码优先 - 多对多 - 包括条件

    我有两个实体Store and Catalog 使用流畅的 Api 建立多对多关系 我想通过以下方式获得商店id所有目录的状态都等于 已发布 下面我尝试编写以下查询 但没有得到预期的结果 var store context Stores I
  • Powershell 不允许我打开 firebase CLI

    每次我输入命令 firebase login 时 Powershell 都不会让我打开 firebase 出现了问题 如何打开文件 ihc 以前用 powershell 打开 firebase 从来没有遇到过问题 现在我明白了在此输入图像描
  • clearInterval 在reactjs 中不起作用

    SetInterval 工作正常 但clearInterval 不起作用 查看我的代码 我有父类 Channel 和子类 Body 当调用 componentDidMount 时 在 body 内 然后我为函数刷新状态设置间隔 在刷新状态函
  • 使用管道在 bash 中划分的最佳方法?

    我只是在寻找一种简单的方法来除法 或提供其他数学函数 假设我有以下命令 find name mp4 wc l 如何获取 wc l 的结果并将其除以 3 我见过的例子不涉及重定向出 入 Using bc bc l lt lt lt scale
  • 如何将参数传递给 DbMigration.Sql() 方法

    使用实体框架迁移时 DbMigration基类有一个 Sql 方法 它接受匿名对象中的参数 http msdn microsoft com en us library system data entity migrations dbmigr
  • D3.js:如何在版本 4 中向直方图添加分布线

    Note 这个问题 https stackoverflow com questions 41248649 d3 js how to add distribution curves to histograms in version 4是关于c
  • 如何获取 UICollectionView 标头的索引路径?

    使用视图的indexPathForItemAtPoint 我将获得单元格的索引路径 但永远不会获得UICollectionReusableView 页眉 页脚 因为它总是返回nil override func collectionView
  • 如何在android中以编程方式绘制下面的图像?

    我是安卓新手 我发现使用画布非常困难 如何在android中绘制下面的图像 我还想让选定的字母在触摸时突出显示 这里是