- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在代码中使用 TransitionDrawable 的预期方式是什么?有例子吗?
我制作了一个小型测试应用程序来放置一些上下文:
public class SkeletonActivity extends Activity {
private Button b;
private ImageView iv;
private TransitionDrawable transition;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Inflate our UI from its XML layout description.
setContentView(R.layout.skeleton_activity);
// Hook up button presses to the appropriate event handler.
b = ((Button) findViewById(R.id.button));
b.setOnClickListener(mButtonListener);
iv = ((ImageView) findViewById(R.id.image));
//XML-based code
transition = (TransitionDrawable)getResources().getDrawable(R.drawable.trans).mutate();
transition.setDrawableByLayerId(transition.getId(0), getResources().getDrawable(R.drawable.trans3));
transition.setDrawableByLayerId(transition.getId(1), getResources().getDrawable(R.drawable.trans4));
//Pure programmatic code
transition = new TransitionDrawable(new Drawable[] {getResources().getDrawable(R.drawable.trans3), getResources().getDrawable(R.drawable.trans4)});
transition.setCrossFadeEnabled(true);
}
OnClickListener mButtonListener = new OnClickListener() {
public void onClick(View v) {
iv.setImageDrawable(transition);
transition.startTransition(5000);
}
};
}
我的 TransitionDrawable xml 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/trans1" />
<item android:drawable="@drawable/trans2" />
</transition>
让我们首先从基于 XML 的代码部分开始(这意味着注释掉 Pure programmatic 代码行)。
如果您运行此代码并按下按钮,您会看到他的图像从 trans1 变为 trans4,而不是从 trans3。为什么不替换初始可绘制对象?
整个 setDrawableByLayerId() 方法令人困惑。在构造函数中,您将指定进入 LayerDrawable 的 Drawable 列表。我想这些就是所谓的索引。那么id不是这样的索引又是什么?
我尝试将 android:id 属性添加到“item”标签。构建此代码时,它不会运行。所以 id 不是您通常拥有的这个 id。
也许是那个位置当前drawable的resId?这似乎也不是。
Id 似乎只是一些数字(可能在 LayerDrawable 中很重要),可以使用 setId(index, id) 设置并使用 getId(index) 获取。默认情况下不分配任何 ID。您可以为尚未添加的图层保留 none。在我的代码中,两个 getId() 调用都返回 -1,这就是为什么在使用 setDrawableByLayerId(-1, ...) 时只有最后一个调用。事实上,注释掉最后一行会给出不同的行为,给出从 trans1 到 trans3 的转换。
如何更改第一个可绘制层?我必须在 setDrawableByLayerId() 之前添加以下代码。即使我不在任何地方使用 50 或 51。这使得它从 trans3 变为 trans4。
transition.setId(0, 50);
transition.setId(1, 51);
我的概念有什么问题,我必须让它变得如此复杂才能让它发挥作用?
我真正想在我的真实应用程序中做的是不使用任何 xml 代码,我认为它没有用。我也想先添加第一层,然后在构建之后才添加第二层,但我们稍后会继续。
让我们试试纯编程代码。它是等价的。事实上,它会立即放入正确的 Drawable。
现在,在此示例应用程序中,它给出了相同的结果。但是,在我的应用程序中(相关代码太复杂,无法在此处发布),我仍然遇到问题:
如果我尝试从 xml 指定的转换中使用预编程的 Drawable,我会得到 getResources().getDrawable(R.drawable.trans) 第二次返回 null:
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): java.lang.NullPointerException
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:581)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.TransitionDrawable$TransitionState.<init>(TransitionDrawable.java:235)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.TransitionDrawable.createConstantState(TransitionDrawable.java:99)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.LayerDrawable.<init>(LayerDrawable.java:94)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.TransitionDrawable.<init>(TransitionDrawable.java:90)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.TransitionDrawable.<init>(TransitionDrawable.java:39)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.graphics.drawable.TransitionDrawable$TransitionState.newDrawable(TransitionDrawable.java:245)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.content.res.Resources.getCachedDrawable(Resources.java:1753)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.content.res.Resources.loadDrawable(Resources.java:1664)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at android.content.res.Resources.getDrawable(Resources.java:581)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457): at net.lp.collectionista.ui.views.CoverView.updateCover(CoverView.java:78)
我在这里错过了什么?缺少 mutate() 的东西?
我提到我还想分两步设置图层,并且完全在代码中。意思是我首先必须做
transition = new TransitionDrawable(new Drawable[] {<1>});
只传入一层。但是我不能在新层上执行 setId(),所以我不能在以后添加新层(尽管阅读 setDrawableByLayerId() 的文档会让您相信您可以)。
通过第二个元素为 null 的 2 数组直接传入第二层会受到惩罚,因此我将只传入与第一层相同的 drawable。
我在这里遗漏了什么并且可以做得更简单吗?
最佳答案
我建议简单地创建一个新的 TransitionDrawable 而不是“强奸”你的旧的。我一直这样做:
这是我的一个代码 fragment ,它为共享按钮创建了一个 TransitionDrawable:
private TransitionDrawable createIconTransition( SharingStates layer1, SharingStates layer2 )
{
Resources res = getContext().getResources();
TransitionDrawable out = new TransitionDrawable( new Drawable[] { res.getDrawable( layer1.mIconId ), res.getDrawable( layer2.mIconId )} );
out.setCrossFadeEnabled( true );
return out;
}
然后调用:
mImageView.setImageDrawable( mTransitionDrawable );
关于安卓用户界面 : TransitionDrawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4566994/
在代码中使用 TransitionDrawable 的预期方式是什么?有例子吗? 我制作了一个小型测试应用程序来放置一些上下文: public class SkeletonActivity exten
我在 xml 中定义了 TransitionDrawable,如下所示: transition.xml 我用它来动画复选框的状态变化: val stateDrawable =
我正在使用 TransitionDrawable 显示一组图像,在 之间进行过渡。使用我的 Activity 中的代码: TransitionDrawable simons; simons=(Tra
我正在尝试使用 TransitionDrawable 来在播放/暂停图标之间切换。当我第一次点击播放按钮时,播放图标保持不变,暂停按钮出现在播放图标的顶部。当我再次单击时,暂停图标消失,播放按钮在那里
我正在使用以下代码在我的 Android 应用程序中运行动画: RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativeL
我尝试了已接受的解决方案 here ,但它似乎忽略了填充。当第二个 View (在本例中为按钮)显示时,它比具有填充的原始 View 小得多。有解决方法吗?谢谢 最佳答案 是的,TransitionD
我阅读了文档,但无法进行转换。事件的流程应该是什么样的?谁叫谁? 假设我想让一个 Activity 调用 init() 来绘制 a 行,然后调用 go 进行 5 秒到 b 行的转换。我必须对此代码做什
我有一个 TransitionDrawable,我需要它的位图。当我使用 getCurrent() 获取它的 Drawable 时,显然结果仍然是一个 TransitionDrawable。但事实是
ViewPropertyAnimator(交叉淡入淡出效果)和 TransitionDrawable 之间的主要区别是什么?虽然两者似乎都在图像过渡上实现了相同的交叉淡入淡出效果。 最佳答案 Tran
我想在 Android 中创建一个带有文本和背景图像的按钮。背景图像应该每隔 X 次淡入淡出。 我使用带有 2 个图像的 TransitionDrawable 来完成这项工作。 但我无法让它处理超过
我正在尝试使用支持库 v4 的 RoundedBitmapDrawable 来显示在 ImageView 中异步加载的圆形位图,无论是圆形还是圆角矩形。 但是,看起来 RoundedBitmapDra
我试图在 CardView 背景上设置一个 switch-color 的动画,但我得到了这个: Cannot resolve method 'setCardBackgroundColor(androi
我试过这个: int firstColor = 0xFFFF0000; // red int secondColor = 0x00FFFFFF; // transparent Drawable[] d
我正在尝试使用 TransitionDrawable 在操作栏上制作一些彩色动画。 我尝试的代码非常简单,在 onCreate 期间,我将转换可绘制对象作为操作栏背景: Drawable d = ge
以下问题:Animate change of view background color on Android我正在尝试通过 TransitionDrawable 使 TextView 在两个背景之间
我有这段代码可以淡入淡出 ImageView 的背景: private void setWithCrossfade(Bitmap bitmap) { //create drawable vec
我想突出显示新添加的 ListView 项目,效果很好。我认为这很简单,但我偶然发现了一个问题: 我想播放 TransitionDrawable 动画,一旦它完成 - 倒带。新项目将高亮显示片刻,然后
我想使用 TransitionDrawable 对一些图像进行转换。但是,TransitionDrawable 只允许两个图像。如何动态更改图像? 最佳答案 如果你想使用 TransitionDraw
我有一个 TransitionDrawable。这两个状态都是 9-patch ,并定义了一个内容区域。问题是利润率太高了——事实上它基本上是应该的两倍。它似乎是将两个 9-patch 的边距相加。
我有一个从 png 渐变到 xml 可绘制对象(一个简单的渐变)的过渡可绘制对象。当我调用 startTransition(int time) 时,图像似乎奇怪地淡出,使前一个可绘制对象在背景中可见,
我是一名优秀的程序员,十分优秀!