在画布,android上的字符串的简单淡出动画

时间:2012-02-18 06:51:41

标签: android animation custom-controls android-animation android-canvas

我有一个从View延伸的自定义视图,其中包含大量以不同角度绘制的文本,我想要一个特定的字符串在首次启动后将其alpha值降低到一定水平。任何建议或片段将不胜感激:)

postInvalidateDelayed(...)似乎无法完成此任务。

3 个答案:

答案 0 :(得分:1)

一种可能性是在FrameLayout内创建两个彼此重叠的视图。一个视图将包含所有静态字符串,另一个视图将包含您要设置动画的字符串。然后,向动画视图添加alpha动画将是一件简单的事情。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <package.MyNonAnimatedView
        android:id="@+id/nonAnimatedView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <package.MyAnimatedView
        android:id="@+id/animatedView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</FrameLayout>

对于动画,您可以附加到动画视图:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="100" />

在您的活动的onCreate(Bundle)方法中,您可以调用AnimationUtils.loadAnimation(Context, int)从xml资源加载动画并将其附加到动画视图(前提是您为其指定了ID)。

答案 1 :(得分:1)

您可以在活动中添加Handler,以指定的时间间隔发送messages。当您的活动从处理程序收到回调时,它可以通知视图更新您要更改的部分。

一个例子:

public class myActivity extends Activity implements Handler.Callback {

    int mDelay = 100; // Update interval (milliseconds).
    Handler mHandler = new Handler(this);
    private Runnable mEvent = new Runnable() {
        @Override
        public void run() {
            mHandler.postDelayed(mEvent, mDelay);
            Message message = mHandler.obtainMessage();
            // Add arguments to message, if required.
            mHandler.sendMessage(message);
        }
    };

    @Override
    public boolean handleMessage(Message message) {
        // Your view update code.
    }

    private void start() {
        mHandler.postDelayed(mEvent, mDelay);
    }

    private void stop() {
        mHandler.removeCallbacks(mEvent);
    }
}

调用start()启动处理程序,stop()停止处理程序。确定何时停止处理程序可能在handleMessage(Message)代码中。

答案 2 :(得分:0)

正确测量垂直文本边界时出现错误。这是我的onDraw方法

Paint myPaint = new Paint();
myPaint.setColor(Color.parseColor("#" + colorAlpha + "3AA6D0"));// initially colorAlpha is ff
Rect r = new Rect();
char[] a = "Hello World".toCharArray();
datePaint.getTextBounds(a, 0, a.length, r);// get the bound of the text, I was not calculating this correctly
canvas.drawText("Hello World", 0, 0, myPaint);// draw the text

int colorValue = Integer.parseInt(colorAlpha, 16);
    colorValue -= 20;// decrease alpha value for next call to onDraw method by postInvalidateDelayed
if (colorValue > 40) {
        colorAlpha = Integer.toHexString(colorValue);


 // this will create the effect of fade out animation
 // because each call to onDraw method is at the difference of 50 millisecond delay 
 // and in each call we are decreasing alpha value by 20.
        postInvalidateDelayed(50, r.left, r.top, r.right, r.bottom);
}