Android:调整GIF大小以覆盖屏幕宽度

时间:2015-04-10 19:22:04

标签: android

我一直在寻找一段时间来解决这个问题。我创建了自己的GIF视图。我想调整此GIF视图的大小,使其覆盖屏幕宽度,具体取决于实际设备的屏幕大小。我得到它的工作,以便GIF将显示它的实际大小,但对于我的朋友的设备,它被描绘得太小。我正在使用Android提供的Movie课程。

我尝试调整画布,但这不起作用。我还尝试了onMeasure方法的多个方法,但它们也没有用。我得到的最接近的是GIF较大但它出现的窗口仍然和以前一样大。下面是GIF视图的代码,以及使用它的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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@drawable/spacevert"
tools:context="com.wina.hengst.hengstdrinkinggame.Multiplayer" >

<TextView
    android:id="@+id/timerTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="74dp"
    android:text="@string/be_ready"
    android:textSize="50sp"
    android:textStyle="bold" />

<LinearLayout
    android:id="@+id/linear"
    android:layout_below="@id/timerTextView"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.wina.hengst.hengstdrinkinggame.GIF
        android:id="@+id/gif"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

<TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/linear"
    android:layout_centerHorizontal="true"
    android:textSize="50sp"
    android:gravity="center"  />





<SeekBar
    android:id="@+id/sliderMulti"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>

<CheckBox
    android:id="@+id/hiddenMulti"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_above="@id/sliderMulti"
    android:text="@string/hidden"
    android:textSize="25sp"
    android:checked="true" />

<TextView 
    android:id="@+id/progress"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_below="@id/sliderMulti"
    android:textSize="25sp"
    />

<Button 
    android:id="@+id/startMulti"
    android:text="@string/start"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_below="@id/progress"
    android:background="@color/Hengstgroen"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="15dp"/>

package com.wina.hengst.hengstdrinkinggame;

import java.io.InputStream;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;

public class GIF extends View {

private InputStream gifInputStream;
private Movie gifMovie;
private int movieWidth, movieHeight;
private long movieDuration;
private long mMovieStart;

public GIF(Context context) {
    super(context);
    init(context);
}

public GIF(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public GIF(Context context, AttributeSet attrs, 
        int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context);
}

private void init(Context context){
    setFocusable(true);

    gifInputStream = context.getResources()
            .openRawResource(R.drawable.sweetlemonade);

    gifMovie = Movie.decodeStream(gifInputStream);
    movieWidth = gifMovie.width();
    movieHeight = gifMovie.height();
    movieDuration = gifMovie.duration();
}

@Override
protected void onMeasure(int widthMeasureSpec, 
        int heightMeasureSpec) {
    setMeasuredDimension(movieWidth, movieHeight);
}

public int getMovieWidth(){
    return movieWidth;
}

public int getMovieHeight(){
    return movieHeight;
}

public long getMovieDuration(){
    return movieDuration;
}

@Override
protected void onDraw(Canvas canvas) {
    long now = android.os.SystemClock.uptimeMillis();
    if (mMovieStart == 0) {   // first time
        mMovieStart = now;
    }


    if (gifMovie != null) {

        int dur = gifMovie.duration();
        if (dur == 0) {
            dur = 1000;
        }

        int relTime = (int)((now - mMovieStart) % dur);

        gifMovie.setTime(relTime);
        gifMovie.draw(canvas, 0, 0);
        invalidate();

    }

}

public void restart() {
    mMovieStart = 0;
}


}

非常感谢您的帮助!

编辑
我发现尝试解决这个问题太难了。我刚刚将gif转换为多个图像并使用了android提供的动画xml。通过使用ImageView调整xml,我可以轻松调整大小。对于转换,我使用了GIMP和一个名为export layers的插件。如果你们中的任何人都知道答案,你可以随时在这里写下答案,我会尝试一下。

1 个答案:

答案 0 :(得分:0)

尝试使用Glide库,它可以将GIF放在ImageViews中。您还需要将ImageView中的layout_width设置为match_parent

https://github.com/bumptech/glide