我有一个从View
延伸的自定义视图,其中包含大量以不同角度绘制的文本,我想要一个特定的字符串在首次启动后将其alpha值降低到一定水平。任何建议或片段将不胜感激:)
postInvalidateDelayed(...)
似乎无法完成此任务。
答案 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);
}