簡単に言うと、アクティビティ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つの方法があります:
映画教室
カスタムビュー
GIFを分割/Androidアニメーションを使用
私が使用しているgifは100フレームであり、安価ではないため、3番目の方法は使用できません。
私はすべてのチュートリアルとSOの質問に目を通しましたが、どれもこれを機能させることができません。
私の質問を読んでいただきありがとうございます。