创建带有阴影的矢量可绘制对象以覆盖图像

2024-02-05

I would like to achieve a layout that looks like the "desired" image as part of the initial app state that informs the user of some basic actions. Right now I'm getting the "actual" image. enter image description here

我需要任何可绘制/图像的背景图像,该图像具有从左下角到右上角倾斜的覆盖层并且具有任何颜色。它还必须能够在任意数量的设备、手机或平板电脑上以相同的形状进行扩展,并支持回 SDK 16。

到目前为止,我一直在放弃使用矢量图像来创建倾斜可绘制对象的想法,然后使用FrameLayout为了达到层次感的效果。我不确定这是否是实现此目的的最佳方法,但我希望覆盖可绘制对象是矢量可绘制对象或九个补丁,这样它就不会在更宽的布局上像素化。

layout/view_layout.xml

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/background_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/bg_image"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="52dp"
        android:layout_gravity="bottom"
        android:background="@drawable/overlay"/>

</FrameLayout>

drawable/overlay.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="48dp" android:height="36dp"
    android:viewportWidth="48" android:viewportHeight="36">

    <path
        android:fillColor="#fff"
        android:pathData="M48,0 L48,36 L0,36 L0,32 Z"/>

</vector>

如果有人知道如何向矢量可绘制对象添加阴影(我一直无法找到方法),或者如果有更好的方法,任何帮助或建议将不胜感激。谢谢!


我最终为解决这个问题所做的就是延长ImageView类并添加自定义绘制逻辑以覆盖图像。它没有像我希望的那样使用 Vector Drawable,但它确实呈现了我所希望的确切效果。这是我的课程的基本轮廓:

public class CoveredImageView extends ImageView {

    static float DENSITY = 1f;
    static final float SHADOW_DISTANCE = 10f;
    static final int SHADOW_COLOR = 0xAA000000;

    Path path;
    Paint paint;

    Point p1, p2, p3;

    public CoveredImageView(Context context) {
        this(context, null);
    }

    public CoveredImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

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

    void init(@NonNull Context context) {
        DENSITY = context.getResources().getDisplayMetrics().density;

        path = new Path();
        paint = new Paint();
        p1 = new Point();
        p2 = new Point();
        p3 = new Point();

        // Required to make the ShadowLayer work properly
        setLayerType(LAYER_TYPE_SOFTWARE, null);
    }

    void updateDrawVariables() {
        int shadowSize = (int)(SHADOW_DISTANCE * DENSITY);

        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        paint.setShadowLayer(shadowSize, 0, -1, SHADOW_COLOR);

        // Offset the actual position by the shadow size so
        int left = 0 - shadowSize;
        int right = getMeasuredWidth() + shadowSize;
        int bottom = getMeasuredHeight();

        p1.set(left, bottom);
        p2.set(right, bottom - (int)(52 * DENSITY));
        p3.set(right, bottom);

        path.setFillType(Path.FillType.EVEN_ODD);
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);
        // Move the path shape down so that the shadow doesn't "fade" at the left and right edges
        path.lineTo(p3.x, p3.y + shadowSize);
        path.lineTo(p1.x, p1.y + shadowSize);
        path.close();
    }

    @Override
    public void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        // Update all the drawing variables if the layout values have changed
        if(changed) {
            updateDrawVariables();
        }
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // Paint the current path values that were set after onLayout()
        canvas.drawPath(path, paint);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建带有阴影的矢量可绘制对象以覆盖图像 的相关文章

  • 如何从android ble扫描结果中获取CRC?

    我每次都从 ble 设备收到 62 字节的扫描结果 使用下面的回调代码获取扫描结果 我可以获取 RSSI 但无法获取 CRC 或者 获取一帧的CRC的逻辑是什么 来自 ble 设备的数据格式 如数据包标头 广告数据 CRC RSSI 如何从
  • Android EditText 和 addTextChangedListener

    我目前正在将数据库管理器移植到 Android 由于性能原因 我喜欢 仅更新已修改的属性 我尝试使用 addTextChangedListener 执行此操作 以便将修改后的条目添加到列表中 但我的程序从未输入其任何方法 EditText
  • Android TelecomManager 中的 addIncomingCall 没有执行任何操作

    我正在尝试使用本机 Android 来电 UI 我有一个连接服务 并且我已经成功注册了一个电话帐户 但在我调用方法 addNewIncomingCall 后什么也没有发生 对我所缺少的有什么想法吗 显现
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 虚拟回调接口

    在 Eclipse 为您创建的来自 Google 的示例主从流代码中 片段中包含以下内容 private Callbacks mCallbacks sDummyCallbacks public interface Callbacks pub
  • Android 中使用黑白 alpha 蒙版的高效位图蒙版

    我想用黑白 alpha 蒙版来掩盖位图 我的蒙版图像是黑白的 黑色区域意味着透明 白色区域意味着不透明 我需要的是 当我使用此蒙版图像来蒙版任何其他图像时 如果蒙版图像的相应区域为黑色 则生成的图像区域应为透明 否则 生成的图像区域应该是不
  • 如何在不使用 Firebase 控制台的情况下发送 Firebase 云消息通知?

    我从新的 Google 通知服务开始 Firebase Cloud Messaging 感谢这段代码https github com firebase quickstart android tree master messaging htt
  • 如何使用 RecyclerView 创建此布局?

    我正在尝试使用这种类型的布局创建回收器视图 这些项目是字符串 可以以不同的大小出现 我不知道每行中有多少项目 我可以使用 StaggeredGridLayoutManager 来做到这一点吗 该图像只是一个假示例 每行可以有更多项目 您可能
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 如何在android中的谷歌地图上聚焦标记

    我只是想知道我们是否可以关注 Android 应用程序中添加的标记 如果是 怎么办 或者有没有其他方法可以完成这项任务 可以说我使用下面的代码添加了一个标记 map addMarker new MarkerOptions title tit
  • 如何在 60 分钟后删除共享首选项

    我想存储登录数据 但希望在 60 分钟后删除该数据 执行此操作的正确方法是什么 在这 60 分钟内可以关闭 停止 打开应用程序 我不想使用内部数据库 这是我的访问代码SharedPreferences sharedpreferences g
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • Android Google Map V2:如何在单击另一个标记时更改先前单击的标记的图标

    更新 我通过添加 previousMarker 对象解决了性能问题 因此 只有先前单击的标记将被删除并替换为默认图标 但是 当我单击标记时 信息窗口仍然不显示 我有一个地图视图并在上面设置了一些标记 我想要的是 当我单击一个标记时 它将其图
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • 使 Recyclerview 固定高度并可滚动

    已解决以下检查答案 所以我试图为我的 Android 应用程序创建评论功能 我想在 recyclerview 中显示评论 然后在 recyclerview 下方有一个按钮和文本视图来添加评论 我想让 recyclerview 具有一定的高度
  • onPrepareOptionsMenu 复制 ActionBar 中的项目

    当我使用 onPrepareOptionsMenu 添加菜单项时 该菜单项会在操作栏中复制其自身 我正在使用片段并在主要活动的 ActionBar 中创建初始菜单 如下所示 Override public boolean onCreateO
  • TabLayout 的不同 tabMode

    我正在使用 ViewPager 和 TabLayout 如果选项卡可以放置在显示 tabMode 上 则它们必须是 app tabMode fixed else app tabMode scrollable 我怎样才能做到这一点 我不明白你
  • 如何从DataSource.Factory获取数据

    我必须调用此方法才能获取所有人员 我根本无法修改这个方法 Query SELECT FROM PERSON TABLE ORDER BY NAME DESC abstract fun getElements DataSource Facto

随机推荐

  • 如何在Python中使用子进程重定向输出?

    我在命令行中执行的操作 cat file1 file2 file3 gt myfile 我想用 python 做什么 import subprocess shlex my cmd cat file1 file2 file3 gt myfil
  • 为什么我的 Swift 循环失败并出现错误“Can't form range with end < start”?

    我有一个 for 循环 它检查一个数字是否是一个数字的因子 然后检查该因子是否是质数 然后将其添加到数组中 根据原始号码 我会收到一条错误消息 致命错误 无法形成结束 这种情况几乎每次都会发生 但对于某些数字来说效果很好 我发现唯一可以使用
  • Excel如何返回满足一定条件的数组?

    如果我的单元格范围内有数据A1 A6这是 Apple Banana Cherry Grape Orange Watermelon 有没有办法返回一个数组 在单个单元格中 用于较大公式的中间步骤 该数组返回上述数组 除了那些满足特定条件的条目
  • 使 MSDeploy (Visual Studio) 不删除 App_Data 文件夹,而是删除其他所有内容

    我正在使用 Visual Studio 的Publish按钮来部署我的网站 并希望在服务器上有一个不同的 App Data 文件夹 有一个复选框Leave extra files on destination do not delete 这
  • C# 中的高性能 TCP 服务器

    我是一名经验丰富的 C 开发人员 但到目前为止我还没有开发过 TCP 服务器应用程序 现在我必须开发一个高度可扩展的高性能服务器 可以处理至少 5 10 000 个并发连接 通过 GPRS 从 GPS 设备获取原始字节数据 一个常见的通信流
  • 在 .net 网站中生成文本文件的最佳方法是什么?

    我的 vb net Web 应用程序中有一个页面 需要将一堆数据放入文本文件中 然后将其提供给用户下载 在 net Web 服务器上构建此类文本文件的最佳 最有效方法是什么 编辑 为了回答下面的问题 这将是下载一次然后丢弃的文件 更新 我将
  • dma_mmap_coherent 和 remap_pfn_range 有什么区别?

    目前 我正在使用示例驱动程序 https github com claudioscordino mmap alloc blob master mmap alloc c从中学习 并从中我建立了自己的自定义驱动程序 mmap 代码几乎是相同的
  • Phonegap Android InAppBrowser 不工作

    我正在使用 Phonegap Cordova 3 0 0 开发 Android 应用程序 当我调用 InAppBrowser 时 我得到了运动事件 mTouchMode 4错误 并且InAppBrowser功能不起作用 那么我该如何解决这个
  • 正则表达式将数字与 Alpha 分开

    我有一堆字符串 10people 5cars 我该如何将其拆分为 10 people 5 cars 它可以是任意数量的数字和文本 我正在考虑编写某种正则表达式 但我确信在 Python 中有一种简单的方法可以做到这一点 gt gt gt r
  • tkinter 非常慢 - 如何加快速度或使用不同的库?

    我正在使用 tkinter 生成 2D 形态图 我发现它非常慢 例如 此脚本在我的 8 核 Xeon 上花费了近 10 秒 usr bin env python3 import random import tkinter as tk A 3
  • CyclicDist 在多个语言环境中变慢

    我尝试使用以下方法实现矩阵乘法CyclicDist module 当我使用一种语言环境与两种语言环境进行测试时 一种语言环境要快得多 是因为两个 Jetson nano 板之间的通信时间真的很长还是我的实现没有利用这种方式CyclicDis
  • Java 8collect()仅isPresent()可选值[重复]

    这个问题在这里已经有答案了 在 Java 8 中是否有更优雅的方法来实现这一目标 list stream map e gt myclass returnsOptional e filter Optional isPresent map Op
  • 使用c实现rsa加密解密

    我正在尝试使用 Open SSL 编写 RSA 加密和解密的 C 代码 但我不能这样做 我用谷歌搜索了它 但无论我从互联网上得到什么代码 它都超出了我的想象 main函数在这里 这是我从堆栈溢出中得到的 我尝试使用它 但它不起作用 可能是我
  • 如何让div的高度占据全部空间?

    这是我的 css 规则和标记 div style height 100 div style width 220px margin left 100px font size 16px height 1 div class navbar inn
  • 下标超出范围 - 如何分配变量以引用工作表中的单元格

    如何正确分配变量来存储对单元格的引用 最后一行抛出下标超出范围错误 Public Sub CommandButton1 Click Dim variance As Range Dim risk As Range Dim time As Ra
  • javascript 未在页面加载时执行?

    在我的html中 在我的 pr
  • 如何在多个报表中使用子报表或从子报表创建父报表?

    我在 Visual Studio 中有一个名为 MainReport 的 Crystal Report 它还有一个子报表 子报表的内容是标题详细信息 但现在其他几个报表都需要这样做 有没有办法在其他报表中重复使用子报表 或者将其从子报表更改
  • 解析来自traceroute命令的数据

    我正在尝试解析 跳数 值traceroute命令并用 bash 脚本输出 有什么提示吗 很新所以谢谢 到目前为止我的脚本看起来像这样 bin bash parse traceroute for hops and output to stdo
  • 在 WIX 中立即执行自定义操作

    有没有办法在第一个对话框 欢迎 出现后立即在 WIX 中执行自定义操作 要求是检查先决条件 其中一些需要自定义操作 当我们单击下一个对话框时 可以执行自定义操作 但标准 WIX 先决条件将与我们的自定义先决条件分开确定 我们需要的自定义操作
  • 创建带有阴影的矢量可绘制对象以覆盖图像

    I would like to achieve a layout that looks like the desired image as part of the initial app state that informs the use