Android:如何以编程方式创建 StateListDrawable

2023-12-21

我有一个 GridView 来显示一些对象,并且在视觉上每个对象都有一个图像图标和一个文本标签。我还希望图像图标在单击时具有一些“推和弹出”效果,也就是说,当按下时,图像将向右下方向移动一小段距离,当释放时返回到其原始位置。

这些对象(及其图像图标)来自一些动态源。我的直觉是为每个项目创建一个 StateListDrawable,它将有两种状态:按下或未按下。对于 GridView 项目视图,我会使用一个 Button,它可以容纳一个 Drawable 和一个标签,这完全满足我的要求。

我定义了一个项目类来包装原始对象:

public class GridItem<T> {

    public static final int ICON_OFFSET = 4;

    private StateListDrawable mIcon;
    private String mLabel;
    private T mObject;

    public Drawable getIcon() {
        return mIcon;
    }

    public void setIcon(Drawable d) {
        if (null == d) {
            mIcon = null;
        }else if(d instanceof StateListDrawable) {
            mIcon = (StateListDrawable) d;
        } else {
            InsetDrawable d1 = new InsetDrawable(d, 0, 0, ICON_OFFSET, ICON_OFFSET);
            InsetDrawable d2 = new InsetDrawable(d, ICON_OFFSET, ICON_OFFSET, 0, 0);
            mIcon = new StateListDrawable();
            mIcon.addState(new int[] { android.R.attr.state_pressed }, d2);
            mIcon.addState(StateSet.WILD_CARD, d1);
            //This won't help either: mIcon.addState(new int[]{}, d1);
        }
    }

    public String getLabel() {
        return mLabel;
    }

    public void setLabel(String l) {
        mLabel = l;
    }

    public T getObject() {
        return mObject;
    }

    public void setObject(T o) {
        mObject = o;
    }

}

现在的问题是,当我触摸网格项目时,图标会按照我的预期“移动”,但当我的手指抬起离开该项目时,它不会恢复其原始位置。

我的问题是:如何以编程方式创建一个 StateListDrawable ,该 StateListDrawable 相当于从 XML 资源(例如

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/image_pressed" />  
    <item android:drawable="@drawable/image_normal" />
</selector>

?


如果您的可绘制对象只是位图,您可以以编程方式绘制它们,目前它应该有所帮助,但是我想知道有什么问题InsetDrawable这里的用法,基本上都是使用准备好的BitmapDrawables以编程方式绘制的,您需要修改您的方法以接受位图b

        Bitmap bc1 = Bitmap.createBitmap(b.getWidth() + ICON_OFFSET, b.getHeight() + ICON_OFFSET, Bitmap.Config.ARGB_8888);
        Canvas c1 = new Canvas(bc1);
        c1.drawBitmap(b, 0, 0, null);
        Bitmap bc2 = Bitmap.createBitmap(b.getWidth() + ICON_OFFSET, b.getHeight() + ICON_OFFSET, Bitmap.Config.ARGB_8888);
        Canvas c2 = new Canvas(bc2);
        c2.drawBitmap(b, ICON_OFFSET, ICON_OFFSET, null);

        mIcon = new StateListDrawable();
        mIcon.addState(new int[] { android.R.attr.state_pressed },  new BitmapDrawable(bc2));
        mIcon.addState(StateSet.WILD_CARD, new BitmapDrawable(bc1));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:如何以编程方式创建 StateListDrawable 的相关文章

  • 通过硬件按钮启动 Android 应用程序

    我希望构建一个在单击特定硬件按钮时启动的 Android 应用程序 例如 当我按下音量增大按钮 30 秒时 应用程序必须在不增加音量的情况下启动 我想知道这可能吗 你可以定义一个BroadcastReceiver处理ACTION MEDIA
  • Google Map Android API v2 无法在 Play 商店应用程序中显示地图

    我正在与Google Map Android API v2在 Android 应用程序中 它可以很好地与未签名的应用程序在不同的设备上 但是 当我签署 apk 并将应用程序上传到 Play 商店时 下载的应用程序显示白屏而不是地图 您使用什
  • 我可以为 Android Activity 分配“默认”OnClickListener() 吗?

    我有一个 Activity 对于布局中的每个小部件 我调用 setOnClickListener 来分配我的 OnClick 处理程序 在我的 OnClick 处理程序中 我使用 switch 语句根据 View 参数的 ID 为每个按钮执
  • 在 Java/Android 中检查字符串是否包含 URL 的最佳方法是什么?

    在 Java Android 中检查字符串是否包含 URL 的最佳方法是什么 最好的方法是检查字符串是否包含 com net org info 其他 或者有更好的方法吗 url 输入到 Android 中的 EditText 中 它可以是粘
  • Android 4.3 虚拟设备 CPU/ABI - 未安装系统映像(eclipse)

    I m trying to set up a new device but I can not continue with the process I think it s because the target version is 4 3
  • Android布局中如何实现Button的自动宽度

    我有几个垂直列出的按钮 我需要它们都具有相同的宽度 而且还要显示其中的所有文本 基本上我需要所有它们的宽度作为最大的宽度的包裹宽度 希望我解释得很好 现在 我已经有一种布局可以在我的 Samsung Galaxy S2 4 1 2 上运行
  • 我无法从 Android 模拟器中删除日语 IME

    我已经多次看到这个问题 但答案总是 从 语言和键盘设置 菜单中取消选中 IME 问题是那里没有复选框 选择菜单 自定义区域设置 en US 菜单 设置 语言和键盘 选择语言 选择 英语 美国 菜单 设置 语言和键盘 日语输入法是唯一的输入法
  • 为什么大多数 Android 设备不像典型操作系统那样有交换区域?

    现在有 Android 支持交换区域来提高性能吗 出于哪些考虑 大多数 Android 设备放弃了该功能 现在有 Android 支持交换区域吗 Quoting 黛安 哈克伯恩 https groups google com d msg a
  • 如何使用android ndk r9b为Android编译FFMPEG

    我想设计一个Android应用程序 可以通过FFMPEG命令播放和编辑视频 但我不知道如何在Android上使用FFMPEG 我尝试过从Google搜索到的许多方法 但它们太旧了 无法实现 现在 FFMPEG的最新版本是2 1 1 Andr
  • 没有 Listview 的 Android 导航抽屉

    我想创建一个像导航抽屉一样的滑动菜单 但是将会有文本视图和图像视图 就像半活动一样 有可能做到这一点吗 您可以使用NavigationDrawer来自支持库 包括一个FrameLayout作为一个孩子DrawerLayout并使androi
  • 迭代 Sqlite-query 中的行

    我有一个表布局 我想用数据库查询的结果填充它 我使用全选 查询返回四行数据 我使用此代码来填充表行内的 TextView Cursor c null c dh getAlternative2 startManagingCursor c th
  • 如何在打开导航抽屉时使背景 Activity 变小?

    我想做我的背景Activity打开时稍微小一点Navigation Drawer 模拟存在的效果Airbnb应用 我想最好的解释是截图 但重点不是让 View 变小 而是让它成为与 Drawer 打开 关闭动画同步的动画 因此 如果您开始打
  • 如何在 Google 地图中创建自定义地图?

    我正在尝试创建一个包含我家地图的 Google 地图应用程序 卧室 浴室 厨房等 使用 GPS 我会找到我现在在家里的位置 并尝试获取到我卧室的方向 步行距离 您可以使用Google的API来获取方向 我需要知道的是 如何添加我家的自定义地
  • 重构 google 的 NetworkBoundResource 类以使用 RxJava 而不是 LiveData

    谷歌的android架构组件教程here https developer android com topic libraries architecture guide html有一部分解释了如何抽象通过网络获取数据的逻辑 在其中 他们使用
  • 超慢的表格布局性能

    我遇到了糟糕的 TableLayout 性能 我在这里读过一些帖子 谈论同样的事情 Android 动态创建表 性能不佳 https stackoverflow com questions 9813427 android dynamical
  • 什么是“多重”启动模式?

    On http developer android com guide topics manifest activity element html http developer android com guide topics manife
  • 如何创建克隆重复视图?

    在我的 Android 应用程序中 我想创建重复的ImageButton已经创建的Imagebutton 我想创造新的Imagebutton以编程方式与 XML 文件中已创建的按钮具有相同的宽度 高度 背景 图像源 边距等 简而言之 我想创
  • 如何使用Android Invalidate()

    在我的主要活动中 我定义了两个视图和一个菜单 浏览次数 1 自定义视图游戏 2 按钮btn 菜单 1 打开项目用于打开文件 菜单布局在不同的活动中定义 基本上 当主活动启动时 它会绘制没有任何内容的自定义视图和按钮 然后我使用菜单中的 打开
  • OnSwipe 方法在 RecyclerView 中不起作用

    我正在开发一个用于播放音频文件的应用程序 创建了包含 2 个选项卡的选项卡布局 两者中都使用了片段RecyclerView两者都被使用 该片段名为LibraryFragment有这个RecycleView其物品在刷卡时必须传递给HomeFr
  • Android,Volley请求,响应阻塞主线程

    使用 Volley 处理较大响应时会发生一些不好的事情 String url AppHelper DOMAIN service pages profile update json this infoTextView setText getS

随机推荐

  • WPF MVVM - 将 UserControls 上的属性绑定到容器的 ViewModel

    我有一个窗口 MainWindow xaml 其中有一个ViewModel MainWindowViewModel cs 我还有一个名为 MyUserControl xaml 的 UserControl 它也有一个相应的 ViewModel
  • PHP MYSQL $行[$变量]

    我正在尝试解决动态表创建和数据获取问题 我正在尝试使用以下代码获取数据 myQuery SELECT col name FROM tabname WHERE sampleid sid result mysql query myQuery r
  • VB.Net 中的空合并运算符(8)

    恐怕这是一个愚蠢的问题 但我必须假设我已经编写 VB Net 太长时间了 现在不知道如何转换它C 空合并运算符 http msdn microsoft com en US library ms173224 28v vs 80 29进入VB
  • Android Java - Joda Date 速度慢

    在 Android 上使用 Joda 1 6 2 以下代码挂起大约 15 秒 DateTime dt new DateTime 最初发布此帖子Android Java Joda Date 在 Eclipse 模拟器中运行缓慢 https s
  • 长按后启用 ScrollView 中元素的拖动

    我已经用 panResponder 和 ScrollView 实现了拖放列表 我希望即使在触摸该项目时也能够滚动列表 问题是当我做滚动手势时该项目会移动 当然 我也希望能够移动该项目 但现在它具有与滚动相同的手势 我想通过仅在长按 1 5秒
  • 如何循环非默认构造类的 boost MPL 列表?

    我有以下示例 include
  • Sqlite从多个表中选择*

    我真的需要一些有关 sqlite 的帮助 我有一个数据库 有两个表 我们称它们为 table1 和 table2 这两个表基本相同 列名相同 列数相同 第一列是文本 其余列是双列 这适用于两个表 我不想将它们合并到一张表中 如果出现通常应该
  • 限制 Prolog 中的搜索 - Magic Square

    我想用 Prolog 程序求解最完美幻方 维基页面 https en wikipedia org wiki Most perfect magic square https en wikipedia org wiki Most perfect
  • 将文本垂直对齐到框的底部?

    我制作了盒子并设置了行高 文本自动垂直居中 有没有一种方法或任何技巧可以将文本设置在框的底部 div width 100px height 100px background eee color 333 text align center l
  • 在 CQRS 的写入端从数据库读取数据

    背景 Diagrams explaining CQRS usually will have clear separation of read and write paths and one way data flow like in thi
  • 如何使用 style.xml 文件中的样式(以及所有其他样式)创建无边框按钮

    我正在尝试创建一个无边框按钮 但我的按钮还有许多其他样式 并且我想通过将代码嵌入到 style xml 文件中来设计无边框按钮 我发现的一种方法是 通过在我的布局文件中使用 style android attr borderlessButt
  • “此安装不支持该项目类型”错误

    我在 W2k3 操作系统上安装了 VS 2008 SP1 在我安装 ASP NET MVC beta 并尝试创建 ASP NET MVC 类型项目后 出现以下错误 此安装不支持该项目类型 如果您已解决此问题 请告诉我 我尝试了这里发布的一些
  • 将 DataGrid 视图转换为 DataSet/DataTable 的最佳方法

    DataSet DataTable and LINQ表达式是常见的DataSource的值DataGridView 现在反过来 是否可以传递 绑定DataGridView记录到DataSet or DataTable Thanks 你可以这
  • 将 RDS 数据导出到 S3/Glacier

    我想将数据从 Oracle RDS 导出到 S3 然后将其移动到 Glacier 我的最终目标是将 RDS 中存储的数据备份到 S3 和 Glacier 以满足合规性要求 任何人都可以建议实现它的最佳方法 RDS 快照存储在 s3 中 但您
  • 生成订单号的好算法

    尽管我喜欢使用 GUID 作为系统中的唯一标识符 但对于订单号等字段来说 它并不是很用户友好 客户可能必须向客户服务代表重复该字段 有什么好的算法可以用来生成订单号 以便它是 Unique 非连续 纯粹用于光学 仅数字值 因此可以通过电话轻
  • 使用 file_get_contents 来验证和访问受 htaccess 保护的文件[重复]

    这个问题在这里已经有答案了 我需要访问受常规 htaccess 文件 身份验证类型 Basic htpasswords 等 保护的外部 php 页面 我想通过请求发送所需的用户名和密码 是否可以 我想避免cURL和所有pecl http如果
  • 添加项目依赖后出错

    我使用 Gradle 构建多个项目 布局如下 ares build gradle ares settings gradle ares ares gui build gradle ares ares persistence build gra
  • 如何在 VS 2015 中启用 C# 脚本?

    如何配置 VS 2015 以启用 Roslyn 的 C 脚本功能 我尝试安装各种 Nuget 包 包括 Microsoft CodeAnalysis CSharp Microsoft CodeAnalysis Scripting CShar
  • 在 C++ 中嵌入 python 函数

    我正在尝试使用 Cython 从 python 生成 c 代码 但名称修饰似乎存在一些问题 我首先生成将代码从 python 转换为 c 代码 然后使用 gcc 将代码编译为 so 我想使用 cython 而不是 C python API
  • Android:如何以编程方式创建 StateListDrawable

    我有一个 GridView 来显示一些对象 并且在视觉上每个对象都有一个图像图标和一个文本标签 我还希望图像图标在单击时具有一些 推和弹出 效果 也就是说 当按下时 图像将向右下方向移动一小段距离 当释放时返回到其原始位置 这些对象 及其图