1

次のような画面を作成しようとしています。

               Some very long text, saying something

今、私が欲しいのは、スプラッシュスクリーンに画像のみをロードすることです。次に、その下のテキストを文字ごとにフェードインさせます。

フレーム 1: S

フレーム 2: そう

3コマ目:ソムなど

私のレイアウトは次のようになります(まだ画像を表示していません):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:id="@+id/fader">    
    </LinearLayout>

 </RelativeLayout>

私のJavaは次のようになります。

public void onCreate(Bundle savedInstanceState)  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);  

    View faderLayout = findViewById(R.id.fader);

    TextView[] faderTextViews = getFaderTextViews();  
    for(int i=0; i<faderTextViews.length; i++)
    {
        ((LinearLayout) faderLayout).addView(faderTextViews[i]);
        faderLayout.invalidate();

    }

}


private TextView[] getFaderTextViews()
{

     final Animation in = new AlphaAnimation(0.0f, 1.0f);
        in.setDuration(3000);

        final Animation out = new AlphaAnimation(1.0f, 0.0f);
        out.setDuration(3000);
     char[] veryLongString = "This is a very long string".toCharArray();
     TextView[] faderTextViews = new TextView[veryLongString.length];
     for(int i = 0; i<faderTextViews.length; i++)
     {
         TextView temp = new TextView(this);
         temp.setText(veryLongString, i, 1);
         temp.setLayoutParams(new LayoutParams(
                    LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
         temp.startAnimation(in);
         faderTextViews[i] = temp;

     }
     return faderTextViews;

}

結局、文字列全体が一度にフェード インします。

これを行う方法はありますか?

4

4 に答える 4

0
AnimationDrawable frameAnimation;
frameAnimation = (AnimationDrawable) addselection.getBackground();

@Override public void onWindowFocusChanged(boolean hasFocus) {
    frameAnimation.start();
    super.onWindowFocusChanged(hasFocus);
}

このタイプの xml でドローアブルを追加します

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/add_selection0001" android:duration="50" />
    <item android:drawable="@drawable/add_selection0002" android:duration="50" />
    <item android:drawable="@drawable/add_selection0003" android:duration="50" />
    <item android:drawable="@drawable/add_selection0004" android:duration="50" />
    <item android:drawable="@drawable/add_selection0005" android:duration="50" />
    <item android:drawable="@drawable/add_selection0006" android:duration="50" />
</animation-list>

シーケンスのアニメーションに異なる画像を設定します。このドローアブルを画像ビューの背景として設定します。

ここの公式ドキュメント Web サイトには、比較的単純な例があります: Animation Resources

于 2012-08-03T03:11:28.073 に答える
0

Google からここにたどり着いた (私のような) 人のために、質問者が望んでいたことを正確に行うことができる素敵なライブラリを次に示します。

https://github.com/hanks-zyh/HTextView

残念ながら、これらのアニメーションはインライン テキストでしか機能しません (複数の行が切り取られます)。それでも、実装が簡単であるだけでなく、かなり便利だと思います。

于 2018-02-15T15:07:57.253 に答える
0

これはいい:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
    super.onResume();
    Animator anim = fadeStringIntoViewGroup((ViewGroup)findViewById(R.id.fader), "A very, very long string.", 3000);
    //here you can add a another listener to anim if you want (a listener could manipulate the views by set ids).
    anim.start();
}

private Animator fadeStringIntoViewGroup(ViewGroup faderTextContainer, final String vls, int duration){
    Context context = faderTextContainer.getContext();
    final FrameLayout textViewHolder = new FrameLayout(context);
    final TextView textView = new TextView(context);
    final TextView helper = new TextView(context);
    textViewHolder.addView(helper);
    textViewHolder.addView(textView);

    SpannableString helperString = new SpannableString(vls);
    helperString.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), 1, vls.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    helper.setAlpha(0);
    helper.setText(helperString);
    setupCreatedViews(faderTextContainer, textViewHolder, textView, helper);

    final int length = vls.length();
    final int stepDuration = duration/length;
    ObjectAnimator anim = ObjectAnimator.ofFloat(helper, "alpha", 0, 1).setDuration(stepDuration);
    anim.setRepeatCount(length);
    anim.addListener(new Animator.AnimatorListener() {
        int at = 1;
        @Override
        public void onAnimationStart(Animator animation) {}

        @Override
        public void onAnimationEnd(Animator animation) {}

        @Override
        public void onAnimationCancel(Animator animation) {}

        @Override
        public void onAnimationRepeat(Animator animation) {
            if (at < vls.length()) {
                SpannableString textViewString = new SpannableString(vls);
                textViewString.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), at, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                textView.setText(textViewString);
                helper.setAlpha(0);
                SpannableString helperString = new SpannableString(vls);
                helperString.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), 0, at, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                helperString.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), at + 1, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                helper.setText(helperString);
                at++;
            }
        }
    });
    return anim;
}

private void setupCreatedViews(ViewGroup containerForAnimatedText, FrameLayout subcontainer, TextView textView, TextView textViewFadeinLetter){
    containerForAnimatedText.addView(subcontainer, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    //here you can set colors, font sizes, ids, padding etc...
}
于 2016-05-02T17:22:14.927 に答える