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

用于画布上字符串的简单淡出动画,android,android,animation,custom-controls,android-animation,android-canvas,Android,Animation,Custom Controls,Android Animation,Android Canvas,我有一个从视图扩展而来的自定义视图,在不同角度绘制了大量文本,我希望某个特定字符串在第一次启动后将其alpha值降低一次到某个级别。任何建议或片段都将不胜感激:) postInvalidateDelayed(…)似乎不适用于此任务。一种可能是在相互重叠的框架布局内创建两个视图。一个视图包含所有静态字符串,另一个视图包含要设置动画的字符串。然后,只需将alpha动画添加到动画视图中即可 <?xml version="1.0" encoding="utf-8"?> <FrameLa

我有一个从
视图
扩展而来的自定义视图,在不同角度绘制了大量文本,我希望某个特定字符串在第一次启动后将其alpha值降低一次到某个级别。任何建议或片段都将不胜感激:)


postInvalidateDelayed(…)
似乎不适用于此任务。

一种可能是在相互重叠的
框架布局内创建两个视图。一个视图包含所有静态字符串,另一个视图包含要设置动画的字符串。然后,只需将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)

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

例如:

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)
code中。

要褪色的垂直文本边界的正确测量中有错误。这是我的
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);
}

你的目标是什么版本的Android?Honeycomb和更高版本有一个动画框架可以用来实现这一点。uses-sdk-android:minSdkVersion=“10”,目标是2.3.3。我知道这个框架,但我只做了以下一步:P.
postInvalidateDelayed(…)
正在工作。正确测量要褪色的文本边界时出错。很好:)但这两个视图是相关的,我必须使用界面等将它们分开,以便简单动画使用这种方法。嗯……如果这两个视图在创建字符串的方式上足够相似,您可以在上面的xml代码中实例化同一个视图两次。通过活动在两个视图(如有必要)之间进行交互非常容易。最简单的方法是将视图代码与动画代码完全分离,但如上所述设置视图动画将使整个视图动画化,而不仅仅是其中的一部分。这种方法也可以使用,但我不知何故使方法
postInvalidateDelayed(…)
起作用。在正确测量要褪色的垂直文本边界时出现了一个错误。我建议您发布解决方案,然后接受它作为答案。