【问题标题】:Simple fade-out animation for a string on canvas, android简单的淡出动画画布上的字符串,android
【发布时间】:2012-02-18 06:51:41
【问题描述】:

我有一个从View 扩展的自定义视图,其中有很多以不同角度绘制的文本,我希望一个特定的字符串在第一次启动后将其 alpha 值降低到某个水平。任何建议或 sn-p 将不胜感激:)

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

【问题讨论】:

  • 您的目标是什么版本的 Android? Honeycomb 及更高版本有一个动画框架,您可以使用它来完成此操作。
  • 使用-sdk android:minSdkVersion="10" ,目标是2.3.3。我知道那个框架,但我比我低一级:P.
  • postInvalidateDelayed(...) 正在工作。正确测量要淡出的文本边界时出现错误。

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


【解决方案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)。

【讨论】:

  • 很好:) 但是这两个视图是相关的,我必须通过使用接口等将它们分开,只是为了简单的动画才能使用这种方法。
  • 嗯...如果这两个视图在创建字符串的方式上足够相似,那么您可能只需在上述 xml 代码中实例化相同的视图两次。通过活动在两个视图之间进行交互(如果需要)很容易。最简单的方法是将视图代码与动画代码完全分开,但如上所述为视图设置动画将动画整个视图,而不仅仅是其中的一部分。
【解决方案2】:

您可以将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) 代码中。

【讨论】:

  • 也可以使用这种方法,但我不知何故得到了方法postInvalidateDelayed(...) 工作。正确测量要淡出的垂直文本边界时出现错误。
  • 我建议发布您必须工作的解决方案,然后接受它作为答案。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多