3

簡単に言うと、アクティビティAが適用されsetContentView(R.id.layout_a)、Aは5秒間実行されます。

カスタムビュークラスを定義し、Movieクラスを使用してgifをロードしてから、カスタムビューをアタッチしようとしましたlayout_aが、空白で表示されます。

WebViewメソッド

WebViewを試しましたが、gifをうまく表示できますが、このアクティビティを初めて起動したときにのみgifをアニメーション化できます。後のアクティビティAが起動されると、最後のフレームが表示されます。

私は試しWebView.reload()ましたが、甘いものはありませんでした。

WebViewを適用しようとしたときの私のコードは次のとおりです。

public class activityA extends Activity {

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.activity_a);

    WebView splashFrame = (WebView)findViewById(R.id.splashFrame);

    splashFrame.setBackgroundColor(Color.TRANSPARENT);
    splashFrame.loadDataWithBaseURL("file:///android_res/drawable/", "<img align='middle' src='face_morph_gif.gif' width='100%' />", "text/html", "utf-8", null);
    splashFrame.reload();

    Handler handler = new Handler();

    // run a thread after 3 seconds to start the home screen
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {

            // make sure we close the splash screen so the user won't come back when it presses back key

            finish();
            // start the home screen

            Intent intent = new Intent(activityA.this, activityB.class);
            SplashScreenActivity.this.startActivity(intent);
        }

    }, 5000); 

  }      
}

質問1:アクティビティAを起動したときに、このgifを最初から再生するにはどうすればよいですか?Safari / Chromeを使用してこのgifを開くと、ブラウザを手動で更新するまで1回だけ再生されることに気付きました。

カスタムビューメソッド

これが私が調べた最初の方法ですが、一度も仕事を得ることができませんでした。

アクティビティAコード:

public class activityA extends Activity {

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.activity_a);
    Handler handler = new Handler();

    // run a thread after 3 seconds to start the home screen
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {

            // make sure we close the splash screen so the user won't come back when it presses back key

            finish();
            // start the home screen

            Intent intent = new Intent(activityA.this, activityB.class);
            SplashScreenActivity.this.startActivity(intent);
        }

    }, 5000); 

  }      
}

カスタムビュー:

public class GifView extends View {

public Movie mMovie;
public long mMovieStart;

public GifView(Context context) {
    super(context);
    setFocusable(true);
    InputStream is = context.getResources().openRawResource(R.drawable.face_morph_gif);
    mMovie = Movie.decodeStream(is);
}

public GifView(Context context, AttributeSet attr) {
    super(context, attr);
    setFocusable(true);
    InputStream is = context.getResources().openRawResource(R.drawable.face_morph_gif);
    mMovie = Movie.decodeStream(is);
}

public GifView(Context context, AttributeSet attr, int defStyle) {
    super(context, attr, defStyle);
    setFocusable(true);
    InputStream is = context.getResources().openRawResource(R.drawable.face_morph_gif);
    mMovie = Movie.decodeStream(is);

}

@Override
protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
//       canvas.drawColor(Color.TRANSPARENT);
   final long now = SystemClock.uptimeMillis();
   if (mMovieStart == 0) {
      mMovieStart = now;
   }
   if (mMovie != null) {
       int dur = mMovie.duration();
//         Log.d("gif Canvas", "duration: " + mMovie.duration());
       if (dur == 0) {
           dur = 4000;
       }

       int relTime = (int)((now - mMovieStart) % dur);
       mMovie.setTime(relTime);
       mMovie.draw(canvas, 10, 10);
//         Log.d("gif Canvas", mMovie.width() + "x" + mMovie.height());
       invalidate();
   }
}

@Override
  protected void onMeasure(final int widthMeasureSpec,
     final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
}

}

そしてlayout_aのxml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/app_background"
tools:ignore="ContentDescription" >

<ImageView
    ... />

<ImageView
    ... />

<ImageView
    ... />

<ImageView
    ... />


<com.xxx.GifView 
    android:id="@+id/splashFrame"
    android:layout_width="95dp" 
    android:layout_height="156dp" 
    android:visibility="visible" />

質問2があります:なぜこのカスタムビューはgifを表示できないのですか?メソッドにブレークポイントを設定onDrawし、mMovieがgifをロードできると確信しています(mMovieはgifの正しい幅と高さを返すことができます)

gifをAndroidで動作させることは非常に古いトピックであることを私は知っています、AFAIKには3つの方法があります:

  1. 映画教室

  2. カスタムビュー

  3. GIFを分割/Androidアニメーションを使用

私が使用しているgifは100フレームであり、安価ではないため、3番目の方法は使用できません。

私はすべてのチュートリアルとSOの質問に目を通しましたが、どれもこれを機能させることができません。

私の質問を読んでいただきありがとうございます。

4

2 に答える 2

1

AndroidフォンでGIFアニメーションを再生するには、WebViewを使用することをお勧めします(Android 2.2以降のみ)。

良いチュートリアルはここにあります:http: //droid-blog.net/2011/10/17/tutorial-how-to-play-animated-gifs-in-android-part-3/

WebViewを開くたびにアニメーションGIFを再生するために、キャッシュをクリアするように注意してください。使用するwebView.clearCache(false);

楽しみ。

于 2012-10-11T12:48:46.317 に答える
0

GIFをWebP形式に変換できます。

いくつかのユーティリティがオンラインで利用できます。これはそのうちの1つです:http ://www.zamzar.com/convert/gif-to-webp/

于 2014-09-14T06:35:23.120 に答える