Android에서 애니메이션 GIF용 View
및 Drawable
사용하세요.
JNI를 통해 번들로 제공되는 GIFLib는 프레임을 렌더링하는 데 사용됩니다. 이 방법은 WebView
또는 Movie
클래스보다 더 효율적입니다.
프로젝트의 build.gradle
파일에 다음 종속성을 삽입합니다.
의존성 { 구현 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Maven 중앙 저장소를 정의해야 합니다. 최상위 build.gradle
에서 다음과 같이 합니다.
빌드 스크립트 { 저장소 { 메이븐센트럴() } } 모든 프로젝트 { 저장소 { 메이븐센트럴() } }
현재 개발 빌드( dev
브랜치에서 빌드)는 OSS 스냅샷 저장소에 게시됩니다. 이를 사용하려면 repositories
블록에 저장소 URL을 지정하십시오.
저장소 { 메이븐센트럴() 메이븐 { URL "https://oss.sonatype.org/content/repositories/snapshots" } } 의존성 { 구현 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<의존성> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>여기에 최신 버전을 삽입하세요</version> <type>아르</type> </종속성>
설정 지침이 포함된 샘플 Eclipse 프로젝트를 참조하세요.
최신 릴리스 다운로드
Android 4.2 이상(API 레벨 17 이상)
GifTextureView
하드웨어 가속 렌더링용
GifTexImage2D
OpenGL ES 2.0+용
네이티브 소스를 컴파일하려면 Android NDK가 필요합니다.
sample
디렉터리를 참조하세요. 샘플 프로젝트가 준비 중입니다. 아직 모든 기능이 포함된 것은 아닙니다.
가장 간단한 방법은 일반 ImageView
처럼 GifImageView
(또는 GifImageButton
)를 사용하는 것입니다.
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:Background="@drawable/bg_anim"/>
android:src
및/또는 android:background
에 의해 선언된 드로어블이 GIF 파일인 경우 자동으로 GifDrawable
로 인식되고 애니메이션이 적용됩니다. 주어진 드로어블이 GIF가 아닌 경우 언급된 뷰는 일반 ImageView
및 ImageButton
처럼 작동합니다.
GifTextView
사용하면 GIF를 복합 드로어블 및 배경으로 사용할 수 있습니다.
<pl.droidsonroids.gif.GifTextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:drawableTop="@drawable/left_anim"android:drawableStart="@drawable/left_anim"android:Background="@drawable/bg_anim "/>
GifImageView
, GifImageButton
및 GifTextView
setter에 대한 후크도 구현되어 있습니다. 따라서 애니메이션 GIF는 setImageResource(int resId)
및 setBackgroundResource(int resId)
호출하여 설정할 수 있습니다.
GifDrawable
다양한 소스에서 직접 생성할 수 있습니다.
//자산 파일GifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //리소스(드로어블 또는 원시)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //파일에 대해 null일 수 있음:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri );//byte arraybyte[] rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); //FileDescriptorFileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = new GifDrawable( fd ); //파일 경로GifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //fileFile gifFile = new File(getFilesDir(),"anim.gif");GifDrawable gifFromFile = new GifDrawable(gifFile); //AssetFileDescriptorAssetFileDescriptor afd = getAssets().openFd( "anim.gif" );GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream(마킹을 지원해야 함)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //직접 ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
GifDrawable이 더 이상 필요하지 않으면 Finalizer에서 InputStream이 자동으로 닫히므로 명시적으로 닫을 필요가 없습니다. recycle()
호출하면 기본 입력 소스도 닫힙니다.
모든 입력 소스에는 처음으로 되감기 기능이 있어야 합니다. 후속 프레임은 소스에서 요청 시 디코딩되므로 애니메이션 GIF(애니메이션이 반복 가능한 경우)를 올바르게 재생해야 합니다.
GifDrawable
Animatable
및 MediaPlayerControl
구현하므로 해당 메서드 등을 사용할 수 있습니다.
stop()
- 애니메이션을 중지하고 모든 스레드에서 호출할 수 있습니다.
start()
- 애니메이션을 시작하며 모든 스레드에서 호출할 수 있습니다.
isRunning()
- 애니메이션이 현재 실행 중인지 여부를 반환합니다.
reset()
- 애니메이션을 되감고, 중지된 애니메이션을 다시 시작하지 않습니다.
setSpeed(float factor)
- 새로운 애니메이션 속도 인자를 설정합니다. 2.0f를 전달하면 애니메이션 속도가 두 배가 됩니다.
seekTo(int position)
- 주어진 position
(밀리초 단위)까지 애니메이션(현재 루프 내)을 찾습니다.
getDuration()
- 애니메이션의 한 루프 지속 시간을 반환합니다.
getCurrentPosition()
- 현재 애니메이션 루프의 시작부터 경과 시간을 반환합니다.
VideoView와 같은 MediaPlayer의 표준 컨트롤을 사용하여 GIF 애니메이션을 제어하고 현재 진행 상황을 표시할 수 있습니다.
다음과 같이 MediaController에서 GifDrawable
MediaPlayer로 설정하면 됩니다.
@Overrideprotected void onCreate(Bundle saveInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib);gib.setImageResource(R.drawable.sample);final MediaController mc = new MediaController(this) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mc.show(); } }); }
getLoopCount()
- NETSCAPE 2.0
확장에 정의된 대로 루프 수를 반환합니다.
getNumberOfFrames()
- 프레임 수(최소 1)를 반환합니다.
getComment()
- 주석 텍스트를 반환합니다(GIF에 주석이 없으면 null
).
getFrameByteCount()
- 단일 프레임의 픽셀을 저장하는 데 사용할 수 있는 최소 바이트 수를 반환합니다.
getAllocationByteCount()
- 주어진 GifDrawable의 픽셀을 저장하는 데 사용되는 할당된 메모리의 크기(바이트)를 반환합니다.
getInputSourceByteCount()
- 지원 입력 데이터의 길이(바이트)를 반환합니다.
toString()
- 이미지 크기 및 프레임 수에 대해 사람이 읽을 수 있는 정보를 반환합니다(디버깅 목적).
GifDrawable
인스턴스를 여러 View
와 연결 일반적으로 여러 View
와 연결된 단일 GifDrawable
인스턴스는 마지막 인스턴스에서만 애니메이션됩니다. MultiCallback
인스턴스 생성 문제를 해결하려면 View
를 추가하고 주어진 드로어블에 대한 콜백을 설정하세요. 예:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
ImageView
등의 드로어블을 변경하면 콜백이 이전 드로어블에서 제거됩니다. 그 후에는 콜백을 다시 할당해야 합니다. 그렇지 않으면 동일한 GifDrawable
인스턴스의 애니메이션이 중지됩니다. 자세한 내용은 #480을 참조하세요.
recycle()
- 메모리 해제 속도를 높이기 위해 제공됩니다(예: android.graphics.Bitmap
).
isRecycled()
- 드로어블이 재활용되는지 확인합니다.
getError()
- 마지막 오류 세부정보를 반환합니다.
이제 최소 API 레벨은 17(Android 4.2)입니다. armeabi
(arm v5 및 v6)는 더 이상 지원되지 않습니다.
이제 최소 API 레벨은 14(Android 4.0)입니다.
소비자 proguard 규칙(라이브러리와 함께 제공됨)이 사용되지 않는 경우에만 의미가 있습니다(Gradle에서 기본적으로 사용됨).
Proguard 규칙 -keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
으로 변경되었습니다.
1.1.17은 API 레벨 8(Froyo)을 지원하는 마지막 버전입니다. 1.2.0부터 최소 API 레벨은 9(진저브레드)입니다.
여러 가지 극단적인 경우 처리가 변경되었습니다.
GifDrawable#getNumberOfFrames()
이제 GifDrawable
이 재활용될 때 0을 반환합니다.
GifDrawable
재활용될 때 GifDrawable#toString()
결과에 포함된 정보에는 이제 0만 포함됩니다.
GifDrawable
사용하기 전에 LibraryLoader.initialize()
호출하는 것이 권장됩니다(필수는 아님). 네이티브 라이브러리를 정상적으로 추출할 수 없는 경우에는 Context
가 필요합니다. 자세한 내용은 ReLinker를 참조하세요. LibraryLoader.initialize()
가 호출되지 않고 일반 라이브러리 로딩이 실패하면 Context
항상 작동하지 않을 수 있는 대체 방식으로 검색을 시도합니다.
int
매개변수 loopNumber
AnimationListener#onAnimationCompleted()
에 추가되었습니다.
Proguard 구성은 이제 라이브러리와 함께 번들로 제공되므로 직접 지정할 필요가 없습니다.
다른 라이브러리와의 충돌 가능성을 피하기 위해 GifTextureView
의 src
XML 속성 이름이 gifSource
로 변경되었습니다.
Proguard 구성이 다음과 같이 변경되었습니다.
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
이제 android.graphics.Bitmap
프레임 버퍼로 사용합니다. 재활용된 GifDrawable
의 픽셀(드로잉 포함)에 액세스하려고 하면 Bitmap
에서처럼 IllegalStateException
발생합니다.
이제 최소 API 레벨은 8(Android 2.2)입니다.
렌더링은 메인 스레드와 독립적으로 실행되는 백그라운드 스레드에서 수행되므로 드로어블을 그리지 않아도 애니메이션이 실행됩니다. 그러나 drawable이 표시되지 않으면 렌더링이 실행되지 않습니다. [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean))을 참조하세요. 이 메서드는 Android 프레임워크에서 아직 처리되지 않은 경우 드로어블 가시성을 제어하는 데 사용할 수 있습니다.
이 라이브러리는 GIFLib 5.1.3 및 SKIA의 코드를 사용합니다.
이미지팩토리
NPM에서 사용할 수 있는 Brad Martin의 NativeScript 플러그인
Sketch GIF, 제스처 확대/축소, 초대형 이미지 블록 표시를 지원하는 강력하고 포괄적인 Android용 이미지 로더입니다.
여기에 프로젝트를 포함하고 싶으십니까? 문제 작성
MIT 라이센스
라이센스 파일을 참조하세요.