استفاده از Gif (حل شد)
سلام دوستان.چجوری میتونم یک عکس gifکه متحرک است رو در برناممون نمایش بدیم.خواهشا کامل توضیح بدین.واقعا احتیاج دارم.
دوستان من یه چیزایی پیدا کردم که البته gif پخش نمیکنه چون جالب بود این جا بیان کردم. شما چندتا عکس میدین که اون تبدیل به gif میکنه و در یک imageview نمایش میده.میتونین از این لینک کدو ببینین من امتحان کردم جالب بود.راستی کد هایی که بعد از Answer6 به بعده رو استفاده کنین.دقت کنین هر سه بخشی که کد هستو به ترتیب باید استفاده کنین.
خب امروز یک روز تعطیل هست (این روز رو به تمامی شیعیان تسلیت میگم) وقتی شد که کمی سرچ کنم و جواب این رو پیدا کنم
برای نمایش دادن یک عنصر متحرک 2 روش پیدا کردم :
1.تمامی فریم ها یکی باشند مانند فایل Gif (منبع)
2. فریم هارو جدا جدا در اختیار داشته باشیم < این روش هم توی پست بالا تر گفته شده و منبعش هم همون هست <
خب اول مورد 1 رو توضیح میدم و سورس ها نمایش فایل Gif رو میزارم که ساده تر هم هست <
+پروژه رو میتونید با اسم (Gif2viewActivity) بسازید
+قبل از هر چیز یک فایل Gif رو درون فولدر asset بزارید
+کلاس زیر رو ایجاد کنید (GifMovieView)
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Movie;
import android.os.SystemClock;
import android.view.View;
public class GifMovieView extends View {
private Movie mMovie;
private long mMoviestart;
public GifMovieView(Context context, InputStream stream) {
super(context);
InputStream mStream = stream;
mMovie = Movie.decodeStream(mStream);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
super.onDraw(canvas);
final long now = SystemClock.uptimeMillis();
if (mMoviestart == 0) {
mMoviestart = now;
}
//انتهای خط زیر هم +1 اضاف شده ، چون وقتی سورس رو تست میکردم اررور میداد و تقسیم بر صفر انجام میشد
final int relTime = (int) ((now - mMoviestart) % (mMovie.duration() + 1));
mMovie.setTime(relTime);
//اینجا من 0و0 گذاشتم ، ولی لازم هست که بصورت حرفه ای تر درون یک ایمیج ویو نمایش داده بشه
mMovie.draw(canvas, 0, 0);
this.invalidate();
}
}
+برای اکتیویتی اصلی یا همون (Gif2viewActivity) کد زیر رو قرار بدید
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.os.Bundle;
public class Gif2viewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
InputStream stream = null;
try {
stream = getAssets().open("new.gif");
}
catch (IOException e) {
e.printStackTrace();
}
GifMovieView view = new GifMovieView(this, stream);
setContentView(view);
}
}
شما میتونید هر تعداد می خواهید فایل Gif درون فولدر asset قرار بدید و برای نمایش استفاده کنید <
فعلا تنها مشکلی که داره این هست که اگر فایل شما از اسکرین بزرگتر باشه < از سمت راست و پایین بیرون میزنه < که برای حل این مشکل میتونید آموزش های CustomControl هارو ببینید و فایل Gif رو درون یک ImageView نمایش بدید (البته هنوز تست نکردم و مطمئن نیستم!)
.
.
.
فعلا دارم این مورد رو روی یک Spinner تست میکنم نتیجه رو بعدا ارایه میدم و همچنین روش اول رو هم توضیح میدم
خب کد بالا رو کمی ویرایش کردم و نتیجه بصورت زیر تغییر کرد و باعث میشه کمی داینامیک باشه .
تجربه ایی که کسب شد < خیلی از فایل های gif به درستی روی View نشون داده نمیشه(بهتره در آینده روشهای دیگه هم تست بشه) < امولاتور (BlueStacks) سی پی یو رو 100% پر میکنه !
+دو فایل Gif در asset قرار دهید (new.gif,two.gif)
+یک فایل xml به نام gifview.xml درست کنید و هیچ کدی لازم نیست بهش اضاف کنید
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
+به پروژه قبلی یک کلاس اضاف کنید (CustomSpiner) بهتره آموزش های بخش 13 رو دیده باشید بهتر متوجه میشید <قراره از این اسپینر به عنوان ویو استفاده بشه تا بتونیم دستور خط زیر رو که در کلاس main اجرا میشه و برای نمایش از View اصلی ما استفاده میکنه جدا باشه و بتونیم عناصر روی UI به درستی تفکیک کنیم
setContentView(view);
سورس CustomSpiner رو بصورت زیر :
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
public class CustomSpiner extends LinearLayout {
@Override
protected void onCreateContextMenu(ContextMenu menu) {
super.onCreateContextMenu(menu);
}
public CustomSpiner(Context context) {
super(context);
initialize(context);
}
public CustomSpiner(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
private void initialize(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.gifview, this, true);
}
}
+کلاس Gif2viewActivity رو به صورت زیر تغییر میدیم (سورس نوشته شده تست هست که نشون میده میتونید با کلیک کردن فایل gif رو در ویو تغییر بدید_منظورم اینه که بجای استفاده از If میتونید دستور رو خیلی دانامیک تر بنویسید) یک باتن هم به فایل main.xml اضاف کنید_برای اسپینر هم یک ID تعریف کنید
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Gif2viewActivity extends Activity {
InputStream stream = null;
CustomSpiner spiner1;
String name = "two.gif";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
spiner1 = (CustomSpiner) findViewById(R.id.Spiner1);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (name.equals("new.gif")) {
name = "two.gif";
} else {
name = "new.gif";
}
try {
stream = getAssets().open(name);
run();
}
catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void run() {
GifMovieView view = new GifMovieView(this, stream);
//setContentView(view);
spiner1.removeAllViews();
//تعیین اندازه ویو برای اسپینر
spiner1.addView(view, 350, 350);
}
}
+کلاس GifMovieView هم بصورت زیر تغییر میکنه (در واقع چون فایل gif با کلیک شدن از asset دریافت میشه در ابتدای شروع برنامه که هنوز کلیکی صورت نگرفته مقدار Stream برابر null هست و باعث کرش میشد) که بصورت زیر تغییر میدیم
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Movie;
import android.os.SystemClock;
import android.view.View;
public class GifMovieView extends View {
private Movie mMovie;
private long mMoviestart;
public GifMovieView(Context context, InputStream stream) {
super(context);
InputStream mStream = stream;
if (mStream != null) {
mMovie = Movie.decodeStream(mStream);
}
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
super.onDraw(canvas);
final long now = SystemClock.uptimeMillis();
if (mMoviestart == 0) {
mMoviestart = now;
}
if (mMovie != null) {
final int relTime = (int) ((now - mMoviestart) % (mMovie.duration() + 1));
mMovie.setTime(relTime);
mMovie.draw(canvas, 0, 0);
this.invalidate();
}
}
}
حالا با کلیک کردن روی باتن < فایل درخواستی شما در ویو نمایش داده میشه
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .