您应该如何使用带有 PathShape 的 ShapeDrawable 在自定义视图上绘制一条线?

2024-02-10

我试图在自定义中画一条线View。我在这里创建了一个简单的Path仅用一个片段,创建了一个PathShape从那开始,最后将其放入ShapeDrawable目的是利用它来借鉴Canvas inside onDraw()。然而,这是行不通的。请参阅我的示例,此处。

package com.example.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.PathShape;
import android.util.Log;
import android.view.View;

public class TestView extends View {

    private Path mPath = null;
    private Paint mPaint = null;
    private PathShape mPathShape = null;
    private ShapeDrawable mShapeDrawable = null;

    public TestView(Context context) {
        super(context);
    }

    private void init() {
        int width = this.getWidth() / 2;
        int height = this.getHeight() / 2;

        Log.d("init", String.format("width: %d; height: %d", width, height));

        this.mPath = new Path();
        this.mPath.moveTo(0, 0);
        this.mPath.lineTo(width, height);

        this.mPaint = new Paint();
        this.mPaint.setColor(Color.RED);

        this.mPathShape = new PathShape(this.mPath, 1, 1);

        this.mShapeDrawable = new ShapeDrawable(this.mPathShape);
        this.mShapeDrawable.getPaint().set(this.mPaint);
        this.mShapeDrawable.setBounds(0, 0, width, height);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        // Doing this here because in the constructor we don't have the width and height of the view, yet
        this.init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Log.d("onDraw", "Drawing");

        // This works, but won't let me do what I'm really trying to do
        canvas.drawLine(0.0f, 0.0f, this.getWidth() / 2.0f, this.getHeight() / 2.0f, this.mPaint);

        // This should work, but does not
        //this.mPathShape.draw(canvas, this.mPaint);

        // This should work, but does not
        //this.mShapeDrawable.draw(canvas);
    }

}

正如你从我的评论中看到的onDraw()方法,既不使用PathShape也不ShapeDrawable画出PathCanvas实际上有效。当我尝试时什么也没有画出来。有谁知道为什么吗?

我正在测试的设备运行的是 Android 4.1.1。


这有两个问题。

第一个是Paint风格。默认为Paint.Stroke.FILL,但是有了一条线就没有什么可以填充的了。我需要添加这个(谢谢,罗曼·盖伊 http://code.google.com/p/android/issues/detail?id=35229#c1):

this.mPaint.setStyle(Paint.Style.STROKE);

第二个问题是标准的高度和宽度PathShape是不正确的。我读过文档 http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html#PathShape%28android.graphics.Path,%20float,%20float%29对此,但没有正确理解。当我解决了第一个问题后,这一点就变得明显了。将其设置为我的自定义视图的高度和宽度(因为我正在整个视图上绘制)解决了这个问题。我还必须改变的界限ShapeDrawable匹配。

this.mPathShape = new PathShape(this.mPath, this.getWidth(), this.getHeight());

and

this.mShapeDrawable.setBounds(0, 0, this.getWidth(), this.getHeight());

希望这对将来的其他人有帮助。

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

您应该如何使用带有 PathShape 的 ShapeDrawable 在自定义视图上绘制一条线? 的相关文章

  • 订阅购买后失效日期无效

    我有一个带有应用内订阅的 Android 应用程序 用户购买订阅后 我通过 Google API 通过我们的后端请求 validUntilTimestampMsec 和 initiationTimestampMsec 返回的时间戳 init
  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • Android Volley:意外响应代码 405

    我的 Android Volley JsonObjectRequest 遇到 onErrorResponse 并出现以下问题 BasicNetwork performRequest Unexpected response code 405
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count
  • 从txt文件中读取数据而不下载它?

    我想从提供的文本文件中解析信息 有没有一种方法可以在应用程序中执行此操作 而无需先下载文件 以某种方式传输文本内容 打开到 URL 的 Http 连接 使用内置 HttpURLConnection 或使用 commons httpclien
  • 尝试在谷歌地图V2 Android应用程序中获取空数组的长度

    我目前正在使用谷歌地图API开发一个Android应用程序 有时我会因为没有明显的原因而发生奇怪的崩溃 在我看来 这是崩溃日志 12 02 16 38 57 071 20796 21137 com appsolute ParkYoo E A
  • Ionic4 电容器 android livereload?

    是否有可能在带有 livereload 的 Android 设备上运行带有电容器的 ionic 4 应用程序 我已经找了几个小时的答案了 但没有成功 请帮忙 如果使用最新版本 ionic cli 现在有一个命令ionic capacitor
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • Ionic 4:硬件后退按钮重新加载应用程序

    从事项目并陷入问题 硬件后退按钮重新加载应用程序 我在此应用程序中使用 Angular Router 我退出应用程序的代码 ionViewDidEnter this subscription this platform backButton
  • 使用audioSessionId值实例化AudioFx类?

    我已经阅读了 Android API 并尝试在互联网上搜索有关声明自定义audioSessionId然后用它audioSessionId初始化 AudioFx 类并为我的 MediaPlayer 或 AudioTrack 分配硬编码audi
  • 如何在我的谷歌上嵌入转弯导航

    我想在我的 Android 应用程序中嵌入逐段导航 请给我一个教程或如何执行此操作的想法 提前致谢 如果您不固定使用谷歌地图 您可以使用基于 OpenStreetMap 地图的维基百科版本 的 SDK 有几个不错的 SDK 提供商 skob
  • 如何解决Android错误类型3?

    下面是我在项目中使用的清单格式 但是每当我尝试运行模拟器时 我都会收到下面提到的错误 请给我一个解决该错误的准确解决方案 工具信息 Android studio Nexus S API 22 android 5 1 1 我的清单文件格式
  • Android 中的 BLE Gatt onConnectionStateChanged 失败,状态为 257

    我正在开发一个同时连接到多个BLE设备的Android应用程序 之后我从这些设备永久读取特征 但过了一会儿 我在onConnectionStateChanged 函数中得到状态257 android文档没有解释错误的原因是什么 或者如何修复
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • Desire HD 中的应用程序崩溃

    由于某些莫名其妙的原因 我的应用程序在 HTC Desire HD 上崩溃了 它在其他手机和模拟器中运行良好 这是崩溃报告 java lang RuntimeException Unable to start activity Compon
  • Android IntentService无法实例化类;没有空构造函数

    我有一个MainActivity需要访问在线 API 从而使用网络资源 的类 这需要我在单独的文件中创建的后台线程HttpRequestService java MainActivity java public class MainActi
  • 使用Gradle组装时如何更改Android应用程序包名称?

    是否可以使用 Gradle 更改 Android 应用程序的包名称 我需要编译同一应用程序的两个副本 并具有唯一的包名称 这样我就可以向市场发布两次 作为使用的更简单的替代方案产品口味 正如伊森的回答 https stackoverflow
  • 调用外部应用程序

    如何从我的应用程序调用外部应用程序 例如 我需要打电话Shazam 应用程序 来自我的应用程序 我可以在应用程序的包名称中看到logcat 这对任何目的都有用吗 特别是对于 Shazam 以下代码有效 Intent intent new I
  • 如何检查设备上是否安装了电子邮件客户端

    我需要检查设备上是否安装了电子邮件客户端 我使用了以下代码 但它对我不起作用 public boolean isIntentAvailable final PackageManager packageManager getApplicati

随机推荐

  • 无需在 go 中阅读即可查看 Conn

    我有一个服务器net Conn 我想在读出字节之前先查看一下它 以检查它是否是客户端尝试使用的纯文本协议或 SSL TLS 检查http golang org pkg net http golang org pkg net 看来Conn接口
  • 如何使用 mvc4 C# 在 linq toEntity 预加载中包含多个表

    我有 6 节课 我尝试使用linq到实体以获得SiglaUF最后一个更深层次的表的信息 在视图 MVC 中 问题是我收到以下错误 ObjectContext 实例已被处置 不能再用于需要连接的操作 视图是这样的 gt model IEnum
  • 数组中元素的确切最大限制是多少

    这是一个纯粹的理论问题 所以请不要在你的答案中警告我这一点 如果我没记错的话 因为 NET 中的每个数组都由Int32 意味着索引范围为0 to Int32 MaxValue 假设不涉及内存 GC 约束 NET 中的数组最多可以有21474
  • 如何将原始 html 文件添加到 create-react-app 中的公共文件夹

    我有一个使用 create react app 创建的 React 应用程序 我已经公开了一个静态 html 页面 我想在使用 iframe 的同一应用程序中使用该 html 构建后 带有 covid html 的 iframe 不会加载
  • jquery 延迟链接被跟踪

    我有一个基于 css 的简短动画 我想在链接之前播放它 一张在页面加载时突然进入的卡片在单击后突然弹出 然而 目前 调用的页面加载速度太快 我希望能够短暂延迟 href 的跟踪 这是我所得到的 document ready function
  • 计算两个地理点之间的最短路径?

    我是 Java 和 Android 新手 我需要找到两个路径点之间的最短路径 我一整天都在寻找答案 我刚刚得到了这个代码 var directionDisplay var directionsService new google maps
  • 应用程序更新后小部件消失了

    更新我的应用程序后 有时所有旧的小部件都会从主屏幕上消失 在应用程序启动器 小部件选择器中 我的三个小部件出现两次 直到重新启动 有什么建议么 在本页 https medium com the wtf files the mysteriou
  • 在 pandas 数据帧上使用 scipy NonlinearConstraint 求解非线性方程

    我正在尝试求解方程组 其中 a b 和 c 是 pandas 数据框中的列 我曾经使用 Excel 在其中运行宏 通过更改其他列 函数 的值来在一列 残差 中进行查找 但我不知道如何在Python中做到这一点 我已经问过here https
  • 指定 Flexbox Flex 项目的宽度:宽度还是基础? [复制]

    这个问题在这里已经有答案了 假设我正在做 3 个弹性列 第一个 50 另外两个自动调整 half flex 0 0 auto width 50 or half flex 0 0 50 这些似乎在功能上是相同的 他们是吗 底部语句相当于 ha
  • 如何将 Python 捆绑到 macOS .app 应用程序中?

    我有一个用 python 编写的软件 带有用 PyQt 编写的图形用户界面 为了创建该软件的可执行文件 我附带了一个 Python 和 Qt 预编译版本 这个技巧似乎在 Windows 和 Linux 中都有效 因为我知道如何创建安装程序
  • 在 Storyboard 中切换 UINavigationController 堆栈的最佳实践

    在我们的故事板中 我们有多个UINavigationController堆栈 例如 LoginViewController堆栈完全独立于SWRevealViewController stack 在它们之间切换的最佳实践是什么 当我按下注销按
  • 使用 MotionEvent.ACTION_MOVE 制作像主屏幕一样的 ViewFlipper

    好的 我有一个ViewFlipper与三个LinearLayouts嵌套在其中 它默认显示第一个 这段代码 Assumptions in my Activity class oldTouchValue is a float vf is my
  • 如何伪造ajax文件上传?

    我有一个上传表单 我想填充一个文件 特别是图像 我的理解是我需要创建一个 File 对象来放入相对形式的 FileList 中 目前我拥有的图像采用数据 URI 格式 data image png base64 但我可以更改它 如果这是真的
  • Spring 模型对象未渲染

    我试图从某些 JSP 页面上的控制器返回消息字符串作为模型对象 成功 jsp 但该消息未在目标页面上呈现 这是我在页面上得到的内容 成功 jsp 欢迎 消息 这是 JSP 页面返回的控制器方法 RequestMapping value re
  • Chrome 消息传递:chrome.runtime.sendMessage 在最新版本 49 上不起作用

    我有一个 Chrome 扩展程序 在版本 48 上运行得很好 但由于某种原因 在版本 49 上无法运行 并且无法在其发布 更改日志中找到任何内容 不起作用的部分是消息传递 背景页 chrome runtime onMessage addLi
  • 可以用 PHP 连接到远程桌面吗?

    我有一些服务器 我想经常连接它们来运行程序 然而 为了使它更容易 我想让一个 PHP 脚本通过远程桌面连接到它们中的每一个并运行它们中的每一个 这可能吗 如果是这样 我应该从哪里开始 举个例子就太好了 理论上 您可以实现一个可以通过 RDP
  • 无法在 Visual Studio 2019 中使用 Azure Function 项目构建 docker compose

    我尝试将 Azure Function 项目添加到在 Visual Studio 2019 16 7 6 中创建的 docker compose 文件中 但这会导致解决方案无法构建 Docker for Windows 2 4 0 0 48
  • 如何在 python 中正确使用 unicode 字符以避免出现错误?

    我正在为 Google 快速搜索框开发一个 python 插件 它对非 ascii 字符做了一些奇怪的事情 看起来代码工作得很好 直到我尝试构造一个包含非 ASCII 字符的字符串 是我的测试字符 我使用以下代码片段进行构建 其中 new
  • 限制 Rust 中的对象生命周期

    我正在包装一个 C 库 它有一个标准类型的上下文对象 library context context library create context 然后使用它你可以创建更多对象 library object object library c
  • 您应该如何使用带有 PathShape 的 ShapeDrawable 在自定义视图上绘制一条线?

    我试图在自定义中画一条线View 我在这里创建了一个简单的Path仅用一个片段 创建了一个PathShape从那开始 最后将其放入ShapeDrawable目的是利用它来借鉴Canvas inside onDraw 然而 这是行不通的 请参