Android实现颜色不断编号的Actionbar
编辑(11/27/12):添加一个视频演示结果在Nexus 7运行Android 4.1系统
过去一年,ActionBar范式已经成为一个重要的组成部分的过程中,设计和开发一个Android应用程序。事实上,有许多优点,ActionBar帮助开发人员在其应用程序能否经得住时间的考验。它包含相关操作,可以很容易地定制,是高度可伸缩的,等等。正因为如此,一个人应该总是考虑使用ActionBar UI模式在设计过程在创建一个新的Android应用程序。
ActionBar功能很多有趣的样式的api。这些api允许您品牌你应用程序,这样,适合你的设计,同时还被辨认在其他的应用程序。简单来说,就是几乎没有限制你能做什么和一个ActionBar。直到你尝试做一些更高级的。。。
为了确保这是可能我创建了一个小小的应用程序与一个ActionBar。我迅速建立了一个AnimationDrawable,开始用一个简单的调用start()方法,并使用它作为ActionBar的背景。结果很令人失望,因为它不是在所有动画。探索ActionBarContainer(一个非公有制视图支持ActionBar)源代码我注意到它没有登记callback1我可拉的:
[java]
public void setPrimaryBackground(Drawable bg) {
mBackground = bg;
invalidate();
}
public void setPrimaryBackground(Drawable bg) {
mBackground = bg;
invalidate();
}
结果,可拉的没有办法通知封闭视图以固定时间间隔重绘本身。从我的角度来看,这是一个想要的行为,以避免这些web -的- - - - 90的红色到黄色闪烁ActionBars。我终于决定推迟到未来版本的动画。
最近我回到了这个特性/增强,开始开发一个新的Animatable可提取测试目的。这个非常基本的绘图改变颜色和变化的变化在一个光滑的时尚:
[java]
public class ColorAnimationDrawable extends Drawable implements Animatable {
private static final long FRAME_DURATION = 1000 / 60;
private static final long ANIMATION_DURATION = 1500;
private static final int ACCCENT_COLOR = 0x33FFFFFF;
private static final int DIM_COLOR = 0x33000000;
private static final Random mRandom = new Random();
private final Paint mPaint = new Paint();
private boolean mIsRunning;
private int mStartColor;
private int mEndColor;
private int mCurrentColor;
private long mStartTime;
@Override
public void draw(Canvas canvas) {
final Rect bounds = getBounds();
mPaint.setColor(mCurrentColor);
canvas.drawRect(bounds, mPaint);
mPaint.setColor(ACCCENT_COLOR);
canvas.drawRect(bounds.left, bounds.top, bounds.right, bounds.top + 1, mPaint);
mPaint.setColor(DIM_COLOR);
canvas.drawRect(bounds.left, bounds.bottom - 2, bounds.right, bounds.bottom, mPaint);
}
@Override
public void setAlpha(int alpha) {
oops("setAlpha(int)");
}
@Override
public void setColorFilter(ColorFilter cf) {
oops("setColorFilter(ColorFilter)");
}
@Override
public int getOpacity() {
return PixelFormat.TRANSPARENT;
}
@Override
public void start() {
if (!isRunning()) {
mIsRunning = true;
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartColor = randomColor();
mEndColor = randomColor();
scheduleSelf(mUpdater, SystemClock.uptimeMillis() + FRAME_DURATION);
invalidateSelf();
}
}
@Override
public void stop() {
if (isRunning()) {
unscheduleSelf(mUpdater);
mIsRunning = false;
}
}
@Override
public boolean isRunning() {
return mIsRunning;
}
private void oops(String message) {
throw new UnsupportedOperationException("ColorAnimationDrawable doesn't support " + message);
}
private static int randomColor() {
return mRandom.nextInt() & 0x00FFFFFF;
}
private static int evaluate(float fraction, int startValue, int endValue) {
return (int) (startValue + fraction * (endValue - startValue));
}
private final Runnable mUpdater = new Runnable() {
@Override
public void run() {
long now = AnimationUtils.currentAnimationTimeMillis();
long duration = now - mStartTime;
if (duration >= ANIMATION_DURATION) {
mStartColor = mEndColor;
mEndColor = randomColor();
mStartTime = now;
补充:移动开发 , Android ,