gpt4 book ai didi

android - 无法理解 Android 自定义可绘制状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:54 25 4
gpt4 key购买 nike

我是 Android 开发的新手,我正在编写一个小应用程序来了解它的工作原理。我已经完成了所有工作,但目前我无法理解自定义可绘制对象状态……让我用一些示例代码来解释一下。

这是我的 attrs.xml,我在其中声明了一个名为“oddMonth”的 bool 值属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DayView">
<attr name="oddMonth" format="boolean"/>
</declare-styleable>
</resources>

然后我有一个自定义 View :

<?xml version="1.0" encoding="utf-8"?>
<com.example.calendar.DayView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="90dp"
android:background="@drawable/dayview_state" >
<TextView android:id="@+id/day_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:paddingRight="3dp" />
</com.example.calendar.DayView>

所以我放了行“android:background="@drawable/dayview_state"”,它指的是文件 dayview_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:easycalendar="http://schemas.android.com/apk/res/com.example.calendar">

<item easycalendar:oddMonth ="true" android:drawable="@drawable/customborder_odd" />
<item easycalendar:oddMonth ="false" android:drawable="@drawable/customborder_even"/>

</selector>

到目前为止...据我所知...我在 attrs.xml 中定义了一个属性。此属性表示我的自定义 View 的状态。根据这个属性的 bool 值,我的应用程序将加载两个不同的 xml 之一(这里不重要),每个都定义了一个不同的 drawable。所以最后一步是构建我的自定义类!以下是类摘录:

public class DayView extends RelativeLayout {
private static final int[] STATE_ODD_MONTH = { R.attr.oddMonth };
private boolean mOddmonth = true;

public DayView(Context mContext, AttributeSet attrs) {
super(mContext, attrs);
}

@Override
protected int[] onCreateDrawableState(int extraSpace) {
if (mOddmonth) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
mergeDrawableStates(drawableState, STATE_ODD_MONTH);

return drawableState;
} else {
return super.onCreateDrawableState(extraSpace);
}
}

public boolean isOddMonth() {
return mOddmonth;
}

public void setOddMonth(boolean oddMonth) {
if (mOddmonth != oddMonth) {
mOddmonth = oddMonth;

refreshDrawableState();
}
}
}

好的...所以我这里有一个私有(private)变量 mOddMonth,带有 getter 和 setter。用于在别处扩充此 View 的构造函数。另一个私有(private)变量:

private static final int[] STATE_ODD_MONTH = { R.attr.oddMonth };

这是一个仅由一个 int 值组成的数组,它是对 attrs.xml 中定义的属性 oddMonth 的引用。以及继承的方法:

@Override
protected int[] onCreateDrawableState(int extraSpace) {
if (mOddmonth) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
mergeDrawableStates(drawableState, STATE_ODD_MONTH);

return drawableState;
} else {
return super.onCreateDrawableState(extraSpace);
}
}

我无法真正“深入”理解...好吧,在我看来,如果局部变量 mOddMonth 为真,我会添加一个状态,否则不会。所以......我的代码只有在我用以下内容替换我的 dayview_state.xml 时才有效:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:easycalendar="http://schemas.android.com/apk/res/com.example.calendar">

<item easycalendar:oddMonth ="true" android:drawable="@drawable/customborder_odd" />
<item android:drawable="@drawable/customborder_even"/>

</selector>

以这种方式,如果存在状态,则加载第一个布局,否则将加载第二个布局。但是国家的值(value)呢?在我的代码中没有任何地方设置这个变量/属性的值....我哪里错了?

最佳答案

我建议你改写你的问题 b/c 在我阅读你对@kcoppock 的回答的评论之前,你并不清楚你在问什么,这是 -

"what i want to do (or I think I should do) is to set this value somewhere in code according to the actual status of my custom view, and then force it to render again.... Or I shouldn't?"

在任何时候,您都可以使用 View.getDrawableState 查询 View 以获取其可绘制状态。

如果基于此,您想要重新渲染您的可绘制对象,那么您有多种选择。

首先你可以调用Drawable.invalidateSelf。但是你很少需要这样做,因为通常你的可绘制对象被设置为 View 的背景可绘制对象,它会在 draw 方法中自动为你绘制(而不是 onDraw,这是你绘制的)。所以在这种情况下你需要做的就是使 View 无效(view.invalidate),它会自动重绘你的背景可绘制对象(因此获取你的可绘制对象状态变化)。

如果您不是将可绘制对象用作背景而是用作主绘图,那么您可以在 onDraw 中绘制可绘制对象。一个简单的 myDrawable.draw(canvas) 就足够了。但是记得让 view.invalidate 触发 onDraw 方法。

关于android - 无法理解 Android 自定义可绘制状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com