当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,