3

私はViewから拡張されたカスタムビューを持っていて、さまざまな角度で描画されたテキストがたくさんあり、特定の文字列を最初に開始。任意の提案やスニペットをいただければ幸いです。キャンバス上の文字列の単純なフェードアウトアニメーション

postInvalidateDelayed(...)このタスクでは機能していないようです。

+0

あなたはどのバージョンのAndroidをターゲットにしていますか?ハニカム以上には、これを達成するために使用できるアニメーションフレームワークがあります。 – MJD

+0

use-sdk android:minSdkVersion = "10"、ターゲットは2.3.3です。私はその枠組みについて知っていますが、私は以下の一歩です:P。 –

+0

'postInvalidateDelayed(...)'が動作しています。退色するテキスト境界の正確な測定に間違いがありました。 –

答えて

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); 
} 
1

FrameLayoutの中にお互いに重なっている2つのビューを作成する可能性があります。 1つのビューにはすべての静的な文字列、もう1つの文字列にはアニメートする文字列が含まれます。次に、アニメーション表示にアルファアニメーションを追加するのは簡単なことです。

<?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> 

そして、あなたはアニメーションのビューにアタッチなり、アニメーションのために:あなたの活動のonCreate(Bundle)メソッド内から

<?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" /> 

、あなたはXMLリソースからアニメーションをロードし、それを添付するAnimationUtils.loadAnimation(Context, int)を呼び出すことができますアニメーション表示(IDを指定した場合)

+0

Nice :)しかし、この2つのビューは関連しており、このアプローチを使用するための単純なアニメーションのためだけにインターフェイスなどを使用してそれらを分離する必要があります。 –

+0

Hmm ... 2つのビューが文字列の作成方法に似ている場合は、上記のXMLコードで同じビューを2回インスタンス化することもできます。 2つのビュー(必要な場合)をアクティビティ経由でやりとりするのは簡単です。最も簡単な方法は、アニメーションコードからビューコードを完全に分離することですが、上記のようにビューをアニメートすると、ビューの一部だけでなく、ビュー全体がアニメートされます。 – happydude

1

指定した間隔でmessagesを送信できるアクティビティにHandlerを追加できます。アクティビティはハンドラからコールバックを受け取ると、変更したい部分を更新するようにビューに通知できます。

例:

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)コード内にあります。

+0

このアプローチも使用できますが、どういうわけか 'postInvalidateDelayed(...)'メソッドが動作しています。退色する垂直テキスト境界の正確な測定に間違いがありました。 –

+0

解決策を投稿し、答えとして受け入れることをお勧めします。 – happydude

関連する問題