অ্যানিমেটেড জিআইএফ প্রদর্শন করুন


261

আমি আমার আবেদনটিতে অ্যানিমেটেড জিআইএফ চিত্রগুলি প্রদর্শন করতে চাই। আমি যেমন হার্ড উপায়টি জানতে পেরেছি যে অ্যান্ড্রয়েড স্থানীয়ভাবে অ্যানিমেটেড জিআইএফ সমর্থন করে না।

তবে এটি অ্যানিমেশনড্রেইবল ব্যবহার করে অ্যানিমেশনগুলি প্রদর্শন করতে পারে :

> গাইড> চিত্র এবং গ্রাফিকস> ড্রয়যোগ্য ওভারভিউ বিকাশ করুন

উদাহরণটি অ্যাপ্লিকেশন রিসোর্সে ফ্রেম হিসাবে সংরক্ষিত অ্যানিমেশন ব্যবহার করে তবে আমার যা প্রয়োজন তা হল সরাসরি অ্যানিমেটেড জিএফ প্রদর্শন করা।

আমার পরিকল্পনা হ'ল ফ্রেমে অ্যানিমেটেড জিআইএফ ভাঙা এবং প্রতিটি ফ্রেমকে অ্যানিমেশনড্রোয়েবলের মতো আকর্ষণীয় হিসাবে যুক্ত করা।

অ্যানিমেটেড জিআইএফ থেকে ফ্রেমগুলি কীভাবে বের করতে হবে এবং তাদের প্রত্যেককে ড্রয়নে রূপান্তর করতে হয় তা কি কেউ জানেন ?


2
আপনার কি অ্যান্ড্রয়েডের মধ্যে অর্থ, বা বাহ্যিক সরঞ্জামের সাহায্যে জিআইএফ থেকে ফ্রেম তোলা?
ওসমান্ড

এটি অবশ্যই একটি বাগ, আরও তথ্যের জন্য ইস্যু ট্র্যাকার দেখুন।
fbtb

অ্যানিমেটেড জিআইএফ প্রদর্শন করতে পারে এমন অ্যাপ্লিকেশন অনুসন্ধান করে যারা এখানে এসেছেন কেবল তাদের জন্যই
রুব 77


জিআইএফ github.com/facebook/fresco প্রদর্শন করতে ফ্রেস্কো ব্যবহার করুন আমার মনে হয় এটি একটি সহজ সমাধান।
কায়িতিয়ান 2121

উত্তর:


191

অ্যান্ড্রয়েড প্রকৃতপক্ষে অ্যান্ড্রয়েড.গ্রাফিক্স.মোভি ক্লাস ব্যবহার করে অ্যানিমেটেড জিআইএফ ডিকোড এবং প্রদর্শন করতে পারে।

এটি খুব বেশি নথিভুক্ত নয়, তবে এসডিকে রেফারেন্সে রয়েছেতদতিরিক্ত , এটি কিছু অ্যানিমেটেড পতাকা সহ বিটম্যাপডেকোড উদাহরণ হিসাবে অ্যাপিডেমোসে নমুনাগুলিতে ব্যবহৃত হয় ।


9
এটা কতটা স্থিতিশীল? আমি এটি আমার অ্যাপ্লিকেশনটিতে প্রয়োগ করেছি, আমার আইসক্রিম স্যান্ডউইচ ডিভাইসে এটি মোটেও কাজ করছে না, ২.৩ এমুলেটর এটি কাজ করছে তবে জিআইএফ ফ্রেমের কয়েকটি বগি (ভুল রঙ)। একটি কম্পিউটারে এটি অবশ্যই ভাল কাজ করছে। কি দেয়?
বেনোইট ডাফেজ

12
@ বিচাউ পোস্ট-এইচসি ডিভাইসে setLayerType(LAYER_TYPE_SOFTWARE)আপনার ভিউতে হওয়া উচিত । তবে এটি এখনও কিছু জিআইএফ এবং কিছু ডিভাইসের জন্য কাজ করে।
মাইচা কে

9
@ মাইকেলł আপনাকে ধন্যবাদ! Paint p = new Paint(); p.setAntiAlias(true); setLayerType(LAYER_TYPE_SOFTWARE, p);কাজ করছে!
ক্লো

1
@ লুবস: LAYER_TYPE_SOFTWARE সেট করার জন্য যথেষ্ট হওয়া উচিত।
পয়েন্টার নুল

2
চলচ্চিত্রের ক্লাসটি উদ্দেশ্য ভিত্তিতে অননুমোদিত - এটি দুর্বল এবং অসমর্থিত। আপনার যদি সঠিক জিআইএফ অ্যানিমেশনগুলির প্রয়োজন হয় তবে আপনি নিজেরাই এটি আরও ভালভাবে প্রয়োগ করেন implement আমি আমার অ্যাপ্লিকেশনটির জন্য এনডিকে ব্যবহার করেছি।
পয়েন্টার নুল

60

হালনাগাদ:

গ্লাইড ব্যবহার করুন:

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.0.0'
}

ব্যবহার:

Glide.with(context).load(GIF_URI).into(new GlideDrawableImageViewTarget(IMAGE_VIEW));

দেখতে ডক্স


1
আমার কাছে এখন ঠিক আছে মনে হচ্ছে, অবশ্যই উত্তরটি পুরো লাইব্রেরিটি অন্তর্ভুক্ত করতে পারে না, সুতরাং কল উদাহরণটি যথেষ্ট বলে মনে হচ্ছে।
চমত্কার

@ গাবরাস স্পষ্টতই পতাকাটি দেওয়ার সময় কোডটি অন্তর্ভুক্ত ছিল না।
জানুয়ারি

1
আপনি যদি ইতিমধ্যে এনডিকে ব্যবহার করেন তবে আমি এই লাইব্রেরিটি ব্যবহার করার পরামর্শ দিচ্ছি না। গ্রেডে এই lib যুক্ত করার পরে, একটি ইউনিটি মডিউল কাজ করা বন্ধ করে দিয়েছে।
রোমিনাভি

এটি আমার পাওয়া সেরা গ্রন্থাগার। আমি আটকে থাকা একটি জিনিস জিআইএফ চিত্রটি জুম করার জন্য চিমটি বাস্তবায়ন করে implementing কেউ কি জানেন?
ভাইপার

28

এছাড়াও (মূল / সম্পদ / এইচটিএমএল / নাম.gif) রাখুন [এইচটিএমএল আকারের সাথে সামঞ্জস্য করুন]

<html style="margin: 0;">
<body style="margin: 0;">
<img src="name.gif" style="width: 100%; height: 100%" />
</body>
</html>

আপনার এক্সএমএলে এটির উদাহরণ হিসাবে ঘোষণা করুন (প্রধান / রেজ / লেআউট / নাম.এক্সএমএল): [আপনি আকারটি সংজ্ঞায়িত করেন, উদাহরণস্বরূপ]

<WebView
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/webView"
android:layout_gravity="center_horizontal" />

আপনার ক্রিয়াকলাপে ওনক্রিটের পরবর্তী কোডটি রেখে দিন

web = (WebView) findViewById(R.id.webView); 
web.setBackgroundColor(Color.TRANSPARENT); //for gif without background
web.loadUrl("file:///android_asset/htmls/name.html");

আপনি যদি গতিশীলভাবে লোড করতে চান তবে আপনাকে ডেটা সহ ওয়েবভিউ লোড করতে হবে:

// or "[path]/name.gif" (e.g: file:///android_asset/name.gif for resources in asset folder), and in loadDataWithBaseURL(), you don't need to set base URL, on the other hand, it's similar to loadData() method.
String gifName = "name.gif";
String yourData = "<html style=\"margin: 0;\">\n" +
        "    <body style=\"margin: 0;\">\n" +
        "    <img src=" + gifName + " style=\"width: 100%; height: 100%\" />\n" +
        "    </body>\n" +
        "    </html>";
// Important to add this attribute to webView to get resource from outside.
webView.getSettings().setAllowFileAccess(true);

// Notice: should use loadDataWithBaseURL. BaseUrl could be the base url such as the path to asset folder, or SDCard or any other path, where your images or the other media resides related to your html
webView.loadDataWithBaseURL("file:///android_asset/", yourData, "text/html", "utf-8", null);
// Or if you want to load image from SD card or where else, here is the idea.
String base = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
webView.loadDataWithBaseURL(base + '/', yourData, "text/html", "utf-8", null);

পরামর্শ: আরও তথ্যের জন্য স্থিতিশীল চিত্রগুলির সাথে আরও ভাল লোড জিএফ হ'ল https://developer.android.com/references/android/ographicics/drawable/AnimationDrawable.html

এটাই, আমি আশা করি আপনি সাহায্য করবেন।


2
আমি কি এসডিকার্ড থেকে জিআইএফ লোড করতে চাই?
জয়দেব

যদি আপনি
এসডকার্ড

এই পদ্ধতিটি ব্যবহার করে, আমি কীভাবে গিফ ফাইলটির নাম পরিবর্তন করতে পারি? আমি আমার অ্যাপ্লিকেশনটিতে প্রদর্শিত হতে হবে এমন প্রতিটি
জিআইএফের

একটি জিআইএফ এর জন্য ওয়েবভিউ?!?! আপনি কর্মক্ষমতা, মেমরির খরচ এবং ব্যাটারি সম্পর্কে কি ভেবেছিলেন?
ডুনা

@ ডুনা যা 5 বছর আগে ছিল, বর্তমানে আমরা উদাহরণস্বরূপ গ্লাইড ব্যবহার করতে পারি
অ্যালেক্স জারাওস

22

আমি জিআইএফ অ্যানিমেশনগুলিকে ফোনে সংরক্ষণের আগে ফ্রেমগুলিতে বিভক্ত করে সমস্যার সমাধান করেছি , সুতরাং অ্যান্ড্রয়েডে আমার এটি মোকাবেলা করতে হবে না।

তারপরে আমি ফোনে প্রতিটি ফ্রেম ডাউনলোড করি, এ থেকে অঙ্কনযোগ্য তৈরি করি এবং তারপরে অ্যানিমেশনড্রাব্যাবল তৈরি করি - আমার প্রশ্নের উদাহরণের সাথে একেবারেই অনুরূপ


2
যা অ্যানিমেশন পরিচালনা করার নথিভুক্ত উপায়।
রিচিএইচএইচ

16

আমি এখানে একটি দুর্দান্ত এবং সাধারণ কাজের উদাহরণ সহ একটি খুব সহজ উপায় পেয়েছি

অ্যানিমেটেড উইজেট প্রদর্শন করুন

এটি কাজ করার আগে কোডে কিছু করণীয় রয়েছে

অনুসরণ

    @Override
    public void onCreate(Bundle savedInstanceState){    
        super.onCreate(savedInstanceStated);   
        setContentView(new MYGIFView());
    }    
}

শুধু প্রতিস্থাপন

setContentView(new MYGIFView());

ভিতরে

setContentView(new MYGIFView(this));

এবং ভিতরে

public GIFView(Context context) {
    super(context);

আপনার নিজস্ব জিআইএফ অ্যানিমেশন ফাইল সরবরাহ করুন

    is = context.getResources().openRawResource(R.drawable.earth);
    movie = Movie.decodeStream(is);
}

প্রথম লাইনে পরিবর্তন করুন

public MYGIFView(Context context) {

ক্লাসের নাম অনুসারে ...

এই সামান্য পরিবর্তনগুলি করার পরে এটি আমার পক্ষে কাজ করা উচিত ...

এই সাহায্য আশা করি


2
আপনি কোন অ্যান্ড্রয়েড সংস্করণে এটি ব্যবহার করে দেখেছেন? আমি অ্যান্ড্রয়েড সংস্করণ ২.২ এবং ২.৩ এ চেষ্টা করেছি তবে এটি মুভি অবজেক্টটি নালায় দেয়। ভুল হতে পারে কি কোন ধারণা?
অশ্বিনী শাহাপুরকর

16
দয়া করে এই উত্তরটি পরিষ্কার করুন, এটি তাই, এলোমেলো।
ট্যাক্সিতা

2
উত্তর নিয়ে সমস্যা কি? এটিকে কাজ করার জন্য আমি কেবল একটি লিঙ্ক এবং কিছু প্রয়োজনীয় সংশোধন সরবরাহ করেছি
অ্যাপসারাইড

10

অ্যান্ড্রয়েডে অ্যানিমেটেড জিআইএফ দেখানোর উপায়:

  • সিনেমা ক্লাস। উপরে উল্লিখিত হিসাবে, এটি মোটামুটি বগি।
  • ওয়েব দর্শন। এটি ব্যবহার করা খুব সহজ এবং সাধারণত কাজ করে। তবে কখনও কখনও এটি খারাপ ব্যবহার করা শুরু করে এবং এটি আপনার কাছে না থাকা কিছু অস্পষ্ট ডিভাইসে সর্বদা থাকে always এছাড়াও, আপনি কোনও ধরণের তালিকার ভিউতে একাধিক উদাহরণ ব্যবহার করতে পারবেন না, কারণ এটি আপনার স্মৃতিতে কাজ করে। তবুও, আপনি এটিকে প্রাথমিক পদ্ধতির হিসাবে বিবেচনা করতে পারেন।
  • জিআইএফসকে বিটম্যাপে ডিকোড করার জন্য কাস্টম কোড এবং এটিকে ড্রয়যোগ্য বা ইমেজভিউ হিসাবে দেখায়। আমি দুটি গ্রন্থাগার উল্লেখ করব:

https://github.com/koral--/android-gif-drawable - ডিকোডার সি তে প্রয়োগ করা হয়েছে, সুতরাং এটি খুব দক্ষ।

https://code.google.com/p/giffiledecoder - ডিকোডার জাভাতে প্রয়োগ করা হয়েছে, সুতরাং এটির সাথে কাজ করা আরও সহজ। এখনও বড় ফাইল সহ, যুক্তিসঙ্গতভাবে দক্ষ।

আপনি জিআইএফডেকোডার শ্রেণীর উপর ভিত্তি করে অনেক লাইব্রেরি পাবেন। এটি একটি জাভা-ভিত্তিক ডিকোডারও, তবে এটি পুরো ফাইলটিকে মেমরিতে লোড করে কাজ করে, সুতরাং এটি কেবলমাত্র ছোট ফাইলগুলিতে প্রযোজ্য।


10

অ্যানড্রয়েড জিআইএফ অ্যান্ড্রয়েডে কাজ করার জন্য আমার খুব কষ্ট হয়েছিল। আমার কেবল দুটি কাজ করা ছিল:

  1. ওয়েব দর্শন
  2. স্থূলাণু

ওয়েবভিউ ঠিক আছে এবং সত্যিই সহজ কাজ করে তবে সমস্যাটি হ'ল ভিউ লোডকে ধীর করে দেয় এবং অ্যাপ্লিকেশনটি এক সেকেন্ড বা তার জন্য প্রতিক্রিয়াশীল হবে। আমি এটা পছন্দ করি না। তাই আমি বিভিন্ন পদ্ধতির চেষ্টা করেছি (কাজ করিনি):

  1. ইমেজভিউএক্স অবচিত!
  2. পিকাসো অ্যানিমেটেড জিআইএফ লোড করেনি
  3. অ্যান্ড্রয়েড-জিআইএফ-অঙ্কনযোগ্য দেখতে দুর্দান্ত লাগছে , তবে এটি আমার প্রকল্পে কিছু ওয়্যারড এনডিকে সমস্যা সৃষ্টি করেছে। এটির ফলে আমার স্থানীয় এনডিকে গ্রন্থাগার কাজ বন্ধ করে দিয়েছে এবং আমি এটি ঠিক করতে সক্ষম হয়েছি

আমার সাথে কিছুটা পিছনে ছিল Ion; অবশেষে, আমার এটি কাজ করছে এবং এটি সত্যিই দ্রুত :-)

Ion.with(imgView)
  .error(R.drawable.default_image)
  .animateGif(AnimateGifMode.ANIMATE)
  .load("file:///android_asset/animated.gif");

অ্যান্ড্রয়েড-জিআইএফ-ড্রইয়েবলের সাথে আমার একই এনডিকে সম্পর্কিত সমস্যা ছিল।
রোমিনাভি

হ্যালো @ রোমিনাভি, লোড জিআইএফ করার সময় আপনি কি অয়নটিতে অগ্রগতি বারটি ব্যবহার করেছেন, কারণ জিআইপি লোড করার সময় আমার অগ্রগতি দেখাতে হবে?
প্যাটেল 135

9

গ্লাইড 4.6

1. জিএফ লোড করতে

GlideApp.with(context)
            .load(R.raw.gif) // or url
            .into(imageview);

2. ফাইল অবজেক্ট পেতে

GlideApp.with(context)
                .asGif()
                .load(R.raw.gif) //or url
                .into(new SimpleTarget<GifDrawable>() {
                    @Override
                    public void onResourceReady(@NonNull GifDrawable resource, @Nullable Transition<? super GifDrawable> transition) {

                        resource.start();
                      //resource.setLoopCount(1);
                        imageView.setImageDrawable(resource);
                    }
                });

8

Glide

গুগলের দ্বারা প্রস্তাবিত অ্যান্ড্রয়েডের জন্য চিত্র লোডার লাইব্রেরি।

  • গ্লাইড পিকাসোর সাথে বেশ অনুরূপ তবে এটি পিকাসোর থেকে অনেক দ্রুত।
  • গ্লাইড পিকাসোর চেয়ে কম স্মৃতি গ্রহণ করে।

সেই গ্লাইডের যা আছে তবে পিকাসো তা করেন না

কোনও সাধারণ চিত্রভিউতে জিআইএফ অ্যানিমেশন লোড করার ক্ষমতা গ্লাইডের সবচেয়ে আকর্ষণীয় বৈশিষ্ট্য হতে পারে। এবং হ্যাঁ, আপনি পিকাসোর সাথে এটি করতে পারবেন না। কিছু গুরুত্বপূর্ণ লিঙ্ক-এখানে চিত্র বর্ণনা লিখুন

  1. https://github.com/bumptech/glide
  2. http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

গুগল গ্লিড কোথায় সুপারিশ করে?
ডেরজু

1
এটি দেখুন, যেখানে বিকাশকারী অ্যান্ড্রয়েড দল তাদের নমুনা অ্যাপ্লিকেশনটিতে গ্লাইড ব্যবহার করেছে। বিকাশকারী.অ্যান্ড্রয়েড.
শোয়েব সিদ্দিক

1
'গ্লাইড পিকাসোর সাথে বেশ অনুরূপ তবে এটি পিকাসোর তুলনায় অনেক দ্রুত' এবং 'গ্লাইড পিকাসোর চেয়ে কম স্মৃতি গ্রহণ করে।' দুঃখিত, আমি এই ধারণাগুলি নিয়ে সন্তুষ্ট নই, দয়া করে এই লিঙ্কটি পছন্দ করুন: मध्यम . com / @multdots / glide-vs-picasso-930eed42b81d । বিটিডব্লিউ, আমি এখন বিল্ড ৩.০.১ (ধীর ইন্টারনেট সংযোগ) এ আপগ্রেড করতে সক্ষম না হওয়ায় গ্লাইড ৪.০ পরীক্ষা করতে পারছি না; তবে আমি জিআইএফ দেখানোর জন্য গ্লাইড ৩.৫.২ পরীক্ষা করেছিলাম, এটি কাজ করে তবে পুরোপুরি কার্যকর হয় না যেমনটি আমি বড় ইমগের (এটি ঝলকানো) আশা করি এবং এটিও একটি সাধারণ সমস্যা। দয়া করে সিএমআইডাব্লু।
Nguyen ট্যান ডেটা

7

ব্যবহারের ImageViewEx , একটি লাইব্রেরি যে সহজ হিসাবে একটি GIF ব্যবহার করে তোলে হিসাবে একটি ব্যবহার ImageView



আমি এই লাইব্রেরি কোডটি দেখেছি, এটি 2 বা আরও বেশি বছরের জন্য ভাল হওয়া উচিত।
নাইটস্কাইকোড

1
হ্যাঁ, আমি মনে করি এটি তুলনামূলকভাবে ঠিক আছে, কেবল ইঙ্গিত করে যে লেখক এটিকে হ্রাস করার সিদ্ধান্ত নিয়েছে। (এবং তাই এটি বজায় রাখবেন না) উল্লেখ করে আমাদের পিকাসোর মতো কিছু ব্যবহার করা উচিত যা অদ্ভুত because সেখানে সরঞ্জাম।
মার্টিন মার্কনকিনি

6

এটি চেষ্টা করুন, প্রগতি বারে বেলো কোড প্রদর্শন জিএফ ফাইল

loading_activity.xml (লেআউট ফোল্ডারে)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff" >

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:indeterminate="true"
        android:indeterminateDrawable="@drawable/custom_loading"
        android:visibility="gone" />

</RelativeLayout>

কাস্টম_লোডিং.এক্সএমএল (অঙ্কনযোগ্য ফোল্ডারে)

এখানে আমি কালো_গিফ.gif (অঙ্কনযোগ্য ফোল্ডারে) রেখেছি, আপনি নিজের জিআইফটি এখানে রাখতে পারেন

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/black_gif"
    android:pivotX="50%"
    android:pivotY="50%" />

লোডিংএকটিভিটি.জভা (পুনরায় ফোল্ডারে)

public class LoadingActivity extends Activity {

    ProgressBar bar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading);
        bar = (ProgressBar) findViewById(R.id.progressBar);
        bar.setVisibility(View.VISIBLE);

    }

}

আমি আপনাকে জিআইএফ ঘোরানো দেখতে। কেন?
অ্যালিক্লিজিন-কিলাকা

আপনি কীভাবে অঙ্কনযোগ্য ফোল্ডারে জিআইএফ রাখতে পারেন?
অপূর্ব

6

অয়ন বা গ্লাইড গ্রন্থাগারের কথা কেউ উল্লেখ করেনি । তারা খুব ভাল কাজ।

ওয়েবভিউয়ের সাথে তুলনা করে পরিচালনা করা সহজ।


5

আমি এই নিবন্ধটির মধ্যে প্রস্তাবিত সমাধানটির সাথে সাফল্য পেয়েছি , নামক একটি ক্লাস GifMovieView, যা এমন একটি রেন্ডার করে Viewযা তার পরে প্রদর্শিত বা নির্দিষ্টটিতে যুক্ত করা যায়ViewGroup । নির্দিষ্ট নিবন্ধের 2 এবং 3 অংশে উপস্থাপিত অন্যান্য পদ্ধতিগুলি দেখুন।

এই পদ্ধতির একমাত্র ত্রুটি হ'ল মুভিতে অ্যান্টিঅ্যালেসিংটি তেমন ভাল নয় (অবশ্যই "ছায়াময়" অ্যান্ড্রয়েড Movieক্লাস ব্যবহারের একটি পার্শ্ব-প্রতিক্রিয়া হতে হবে )। এরপরে আপনি আপনার অ্যানিমেটেড জিআইএফ এর মধ্যে একটি শক্ত রঙে ব্যাকগ্রাউন্ড সেট করা থেকে ভাল।


4

বিটম্যাপডেকোড উদাহরণে কিছু চিন্তাভাবনা ... মূলত এটি অ্যান্ড্রয়েড.গ্রাফিক্স থেকে প্রাচীন, তবে বৈশিষ্ট্যহীন চলচ্চিত্রের ক্লাস ব্যবহার করে । সাম্প্রতিক এপিআই সংস্করণগুলিতে আপনাকে এখানে বর্ণিত হিসাবে হার্ডওয়্যার ত্বরণ বন্ধ করতে হবে । এটা অন্যথায় আমার জন্য segfaulting ছিল।

<activity
            android:hardwareAccelerated="false"
            android:name="foo.GifActivity"
            android:label="The state of computer animation 2014">
</activity>

এখানে বিটম্যাপডেকোড উদাহরণ কেবলমাত্র জিআইএফ অংশ দিয়ে সংক্ষিপ্ত করা হয়েছে। আপনাকে নিজের উইজেট তৈরি করতে হবে (দেখুন) এবং এটি নিজের দ্বারা আঁকতে হবে। ইমেজভিউয়ের মতো যথেষ্ট শক্তিশালী নয়।

import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.*;
import android.view.View;

public class GifActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new GifView(this));
    }

    static class GifView extends View {
        Movie movie;

        GifView(Context context) {
            super(context);
            movie = Movie.decodeStream(
                    context.getResources().openRawResource(
                            R.drawable.some_gif));
        }
        @Override
        protected void onDraw(Canvas canvas) {   
            if (movie != null) {
                movie.setTime(
                    (int) SystemClock.uptimeMillis() % movie.duration());
                movie.draw(canvas, 0, 0);
                invalidate();
            }
        }
    }
}

2 টি অন্যান্য পদ্ধতি, একটি চিত্রউইভের সাথে অন্যটি ওয়েবউভের সাথে এই সূক্ষ্ম টিউটোরিয়ালে পাওয়া যাবে । ইমেজভিউ পদ্ধতিটি গুগল কোড থেকে অ্যাপাচি লাইসেন্সযুক্ত অ্যান্ড্রয়েড-জিফভিউ ব্যবহার করে ।


1
@ লুবুজ আপনি দয়া করে আমাকে বলতে পারবেন কোন পদ্ধতিটি অ্যান্ড্রয়েডের পারফরম্যান্সের জন্য ভাল ... আমি স্প্ল্যাশ স্ক্রিন লোডিং বারের জন্য অ্যানিমেটেড জিএফ ব্যবহার করতে চাই। সুতরাং আপনি দয়া করে কোন পদ্ধতিটি ভাল তা বলতে পারেন। এছাড়াও আমি জানতে চাই যে চিত্র প্রদর্শনের পদ্ধতিটি ব্যবহার করে স্কেল ধরণের সম্পত্তি ব্যবহার করা সম্ভব?
অদলবদ-আইওএস-অ্যান্ড্রয়েড

4

@ পয়েন্টারনুল ভাল সমাধান দিয়েছেন, তবে এটি নিখুঁত নয়। এটি বড় ফাইলগুলির সাথে কিছু ডিভাইসে কাজ করে না এবং প্রাক আইসিএস সংস্করণে ব-দ্বীপ ফ্রেমের সাথে বগি জিফ অ্যানিমেশন দেখায়। আমি এই বাগগুলি ছাড়াই সমাধান পেয়েছি। এটি লাইব্রেরিটি হ'ল দেশীয় ডিকোডিংয়ের সাথে আঁকতে সক্ষম : কোরালের অ্যান্ড্রয়েড-জিআইএফ-আঁকামুক্ত


2

এটি একটি ওয়েবভিউতে রাখুন, ডিফল্ট ব্রাউজারটি জিআইএফ ফাইলগুলিকে সমর্থন করার কারণে এটি এটি সঠিকভাবে প্রদর্শন করতে সক্ষম হতে হবে। (ফ্রয়েও +, যদি আমার ভুল না হয়)


এটি সত্য নয়। সমস্ত ব্রাউজার জিআইএফ সমর্থন করে না।
রিচিএইচএইচ

4
আশা করি আমাদের সকল ব্রাউজারের দরকার নেই ... স্ট্রোক ব্রাউজারটি এন্ড্রয়েড ২.২ থেকে এটি সমর্থন করে, তাই দয়া করে আমাকে হ্রাস করবেন না। একটি ওয়েবভিউ অবশ্যই জিআইএফ প্রদর্শন করবে!
কিবিবি

2

আমাদের অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিতে অ্যানিমেটেড জিআইএফ লোড করার জন্য দুটি বিকল্প রয়েছে

1) একটিতে জিআইএফ লোড করতে গ্লাইড ব্যবহার করে ImageView

    String urlGif = "https://cdn.dribbble.com/users/263558/screenshots/1337078/dvsd.gif";
    //add Glide implementation into the build.gradle file.
    ImageView imageView = (ImageView)findViewById(R.id.imageView);
    Uri uri = Uri.parse(urlGif);
    Glide.with(getApplicationContext()).load(uri).into(imageView);

2) এইচটিএমএল ব্যবহার করে জিএফ লোড করতে একটি WebView

.Gif ফাইলের ঠিকানা সহ এইচটিএমএল তৈরি করুন:

<html style="margin: 0;">
<body style="margin: 0;">
<img src="https://..../myimage.gif" style="width: 100%; height: 100%" />
</body>
</html>

সম্পদ ডিরেক্টরিতে এই ফাইলটি সঞ্চয় করুন:

এখানে চিত্র বর্ণনা লিখুন

আপনার অ্যাপ্লিকেশনের ওয়েবভিউতে এই এইচটিএমএল লোড করুন:

    WebView webView =  (WebView)findViewById(R.id.webView);
    webView = (WebView) findViewById(R.id.webView);
    webView.loadUrl("file:///android_asset/html/webpage_gif.html");

হেরেস এই দুটি বিকল্পের একটি সম্পূর্ণ উদাহরণ

এখানে চিত্র বর্ণনা লিখুন


2

কেবল অ্যান্ড্রয়েড এপিআই (অ্যান্ড্রয়েড পাই) 28 এবং + এর জন্য

হিসাবে অ্যানিমেটেড ইমেজড্রেব্যাবল ব্যবহার করুন

// ImageView from layout
val ima : ImageView = findViewById(R.id.img_gif)
// create AnimatedDrawable 
val decodedAnimation = ImageDecoder.decodeDrawable(
        // create ImageDecoder.Source object
        ImageDecoder.createSource(resources, R.drawable.tenor))
// set the drawble as image source of ImageView
ima.setImageDrawable(decodedAnimation)
// play the animation
(decodedAnimation as? AnimatedImageDrawable)?.start()

এক্সএমএল কোড, একটি চিত্র ভিউ যুক্ত করুন

<ImageView
    android:id="@+id/img_gif"
    android:background="@drawable/ic_launcher_background" <!--Default background-->
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    android:layout_width="200dp"
    android:layout_height="200dp" />

AnimatedImageDrawable অঙ্কনযোগ্য এবং এটি দ্বারা নির্মিত একটি শিশু ImageDecoder.decodeDrawable

ImageDecoder.decodeDrawableযার জন্য আরও ImageDecoder.Sourceতৈরির উদাহরণটি প্রয়োজন ImageDecoder.createSource

ImageDecoder.createSourceশুধুমাত্র একটি নামের উৎস নিতে পারে, ByteBuffer, ফাইল, resourceId, কোনো URI, ContentResolver উৎস বস্তু এবং ব্যবহারসমূহ সেটি তৈরি করতে তৈরি করতে AnimatedImageDrawableযেমন Drawable(বহুরুপী কল)

static ImageDecoder.Source  createSource(AssetManager assets, String fileName)
static ImageDecoder.Source  createSource(ByteBuffer buffer)
static ImageDecoder.Source  createSource(File file)
static ImageDecoder.Source  createSource(Resources res, int resId)
static ImageDecoder.Source  createSource(ContentResolver cr, Uri uri)

দ্রষ্টব্য: আপনি চিত্র ডিকোডার # ডিকোডবিটম্যাপBitmap ব্যবহার করে তৈরি করতে পারেন ।

আউটপুট:

অ্যানিমেটেড ড্র্রেবলও আকার পরিবর্তন, ফ্রেম এবং রঙ ম্যানিপুলেশন সমর্থন করে


1

আমি মনে করি জিআইএফ ফাইলগুলি হ্যান্ডেল করার জন্য আরও ভাল গ্রন্থাগার এটি হ'ল: করাল দ্বারা

এটি ব্যবহৃত হয়েছে এবং আমি সফল এবং এই গ্রন্থাগারটি জিআইএফ'র জন্য উত্সর্গীকৃত; কিন্তু যেখানে পিকাসো এবং পিছলে পড়া হয় সাধারণ কাজের ইমেজ ফ্রেমওয়ার্ক; সুতরাং আমি মনে করি এই লাইব্রেরির বিকাশকারীরা পুরোপুরি জিআইএফ ফাইলগুলিতে মনোনিবেশ করেছে



1

কেবল জুড়তে চেয়েছিলেন যে মুভি ক্লাসটি এখন অবহেলিত।

এই শ্রেণিটি পিপিআই লেভেল পি অবচয় পেয়েছিল

এটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে

AnimatedImageDrawable

অ্যানিমেটেড ছবি আঁকার জন্য অঙ্কনযোগ্য (জিআইএফ এর মতো)।


1

এসসিআর ফোল্ডারের অধীনে "ইউটিসস" নামে একটি প্যাকেজ তৈরি করুন এবং "জিফআইমেজভিউ" নামে একটি শ্রেণি তৈরি করুন

public class GifImageView extends View {
    private InputStream mInputStream;
    private Movie mMovie;
    private int mWidth, mHeight;
    private long mStart;
    private Context mContext;
    public GifImageView(Context context) {
        super(context);
        this.mContext = context;
    }
    public GifImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public GifImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        if (attrs.getAttributeName(1).equals("background")) {
            int id = Integer.parseInt(attrs.getAttributeValue(1).substring(1));
            setGifImageResource(id);
        }
    }
    private void init() {
        setFocusable(true);
        mMovie = Movie.decodeStream(mInputStream);
        mWidth = mMovie.width();
        mHeight = mMovie.height();
        requestLayout();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(mWidth, mHeight);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        long now = SystemClock.uptimeMillis();
        if (mStart == 0) {
            mStart = now;
        }
        if (mMovie != null) {
            int duration = mMovie.duration();
            if (duration == 0) {
                duration = 1000;
            }
            int relTime = (int) ((now - mStart) % duration);
            mMovie.setTime(relTime);
            mMovie.draw(canvas, 0, 0);
            invalidate();
        }
    }
    public void setGifImageResource(int id) {
        mInputStream = mContext.getResources().openRawResource(id);
        init();
    }
    public void setGifImageUri(Uri uri) {
        try {
            mInputStream = mContext.getContentResolver().openInputStream(uri);
            init();
        } catch (FileNotFoundException e) {
            Log.e("GIfImageView", "File not found");
        }
    }
}

এখন মেইনএকটিভিটি ফাইলটিতে জিফআইমেজভিউ সংজ্ঞায়িত করুন: src / কার্যকলাপ / মেইনএকটিভিটি.ক্লাস

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GifImageView gifImageView = (GifImageView) findViewById(R.id.GifImageView);
        gifImageView.setGifImageResource(R.drawable.smartphone_drib);
    }
}

এখন ইউআই পার্ট ফাইল: রেজ / লেআউট / ক্রিয়াকলাপ_মিন.এক্সএমএল

<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:gravity="center"
    android:background="#111E39"
    tools:context=".Activity.MainActivity">
    <com.android.animatedgif.Utils.GifImageView
        android:id="@+id/GifImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

পুনরুদ্ধার কোড: অ্যান্ড্রয়েড উদাহরণ


চিত্রটি কীভাবে আকার দিন, প্লিজ
ডেড গাই

0

সবার আগে অ্যান্ড্রয়েড ব্রাউজারের অ্যানিমেটেড জিআইএফ সমর্থন করা উচিত। যদি তা না হয় তবে এটি একটি বাগ! ইস্যু ট্র্যাকারদের একবার দেখুন।

আপনি যদি কোনও ব্রাউজারের বাইরে এই অ্যানিমেটেড জিআইএফগুলি প্রদর্শন করেন তবে এটি অন্যরকম গল্প হতে পারে। আপনি যা যা বলছেন তা করার জন্য বাহ্যিক গ্রন্থাগার প্রয়োজন যা অ্যানিমেটেড জিআইএফগুলির ডিকোডিং সমর্থন করে।

কলটির প্রথম পোর্টটি জাভা 2 ডি বা জাইএআই (জাভা অ্যাডভান্সড ইমেজিং) এপিআইয়ের দিকে নজর দেওয়া হবে, যদিও অ্যান্ড্রয়েড ডালভিক যদি আপনার অ্যাপ্লিকেশনটিতে এই লাইব্রেরিগুলিকে সমর্থন করে তবে আমি খুব অবাক হব।


কিছু ডিভাইস অ্যানিমেটেড জিআইএফ এমনকি ওয়েব ব্রাউজারে দেখায় না। উদাহরণ হিসাবে, আমি জানি যে অ্যান্ড্রয়েড ২.৩..6 সহ গ্যালাক্সি মিনি তাদের দেখায় না।
অ্যান্ড্রয়েড বিকাশকারী

0

@ লিওন্টি যা বলেছিলেন তার মতো, তবে কিছুটা গভীরতার সাথে:

আমি একই সমস্যাটি সমাধান করার জন্য যা করেছি তা হ'ল জিআইএমপি খোলা ছিল, একটি ব্যতীত সমস্ত স্তরগুলি আড়াল করানো ছিল, এটি নিজস্ব চিত্র হিসাবে রফতানি করা হয়েছিল এবং তারপরে সেই স্তরটি আড়াল করুন এবং পরেরটি আনহাইড করুন until যতক্ষণ না আমার প্রত্যেকটির জন্য পৃথক সংস্থান ফাইল রয়েছে । তারপরে আমি এনিমেশনড্রেবলযোগ্য এক্সএমএল ফাইলে তাদের ফ্রেম হিসাবে ব্যবহার করতে পারি।


1
আপনার যদি খুব বেশি সময় না থাকে তবে আপনি ফ্রেমগুলি বের করতে জিফসিকলটি ব্যবহার করতে পারেন । এছাড়াও এক্সএমএল ফাইল উত্পন্ন করার সময় পাইথন বা বাশ খুব সহজ।
লুবস

0

আমি ফ্রেমগুলিতে জিএফ বিভাজন করে স্ট্যান্ডার্ড অ্যান্ড্রয়েড অ্যানিমেশন ব্যবহার করে এটি সমাধান করেছি


0

অ্যাপগুলিতে জিআইএফ দেখানোর জন্য আমি কিছু করেছি। আমি ইমেজভিউ প্রসারিত করেছি যাতে লোকেরা এর বৈশিষ্ট্যগুলি অবাধে ব্যবহার করতে পারে। এটি ইউআরএল থেকে বা সম্পদ ডিরেক্টরি থেকে জিআইএফগুলি দেখাতে পারে। পাঠাগারটি ক্লাসগুলি বাড়ানো থেকে উত্তরাধিকারী হওয়া এবং জিআইএফ শুরু করার জন্য বিভিন্ন পদ্ধতি সমর্থন করার জন্য এটি প্রসারিত করা সহজ করে তোলে।

https://github.com/Gavras/GIFView

গিথুব পৃষ্ঠায় একটি ছোট গাইড আছে।

এটি অ্যান্ড্রয়েড আর্সেনালেও প্রকাশিত হয়েছিল:

https://android-arsenal.com/details/1/4947

উদাহরণ ব্যবহার করুন:

এক্সএমএল থেকে:

<com.whygraphics.gifview.gif.GIFView xmlns:gif_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_activity_gif_vie"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:scaleType="center"
        gif_view:gif_src="url:http://pop.h-cdn.co/assets/16/33/480x264/gallery-1471381857-gif-season-2.gif" />

ক্রিয়াকলাপে:

    GIFView mGifView = (GIFView) findViewById(R.id.main_activity_gif_vie);

    mGifView.setOnSettingGifListener(new GIFView.OnSettingGifListener() {
                @Override
                public void onSuccess(GIFView view, Exception e) {
                    Toast.makeText(MainActivity.this, "onSuccess()", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(GIFView view, Exception e) {

        }
});

প্রোগ্রামটিগতভাবে জিআইএফ সেট করা:

mGifView.setGifResource("asset:gif1");

0

সহজতম উপায় - নীচের কোডটি বিবেচনা করা যেতে পারে

আমরা ইমেজভিউ সেট ইমেজআর রিসোর্সটির সুবিধা নিতে পারি, তার জন্য নীচের কোডটি উল্লেখ করুন।

নীচের কোডটি জিআইএফ ইনসেসের মতো চিত্রটি দেখানোর জন্য আপনার কাছে জিআইএফের একাধিক বিভক্ত চিত্র থাকলে ব্যবহার করা যেতে পারে। কেবলমাত্র একটি জিআইএফকে একটি অনলাইন সরঞ্জাম থেকে পৃথক পিএনজিতে বিভক্ত করুন এবং চিত্রটি নীচের ক্রমের মতো আঁকতে সক্ষম করুন

image_1.png, image_2.png, ইত্যাদি

গতিময়ভাবে চিত্রটি পরিবর্তন করতে হ্যান্ডলারটি রাখুন।

int imagePosition = 1;
    Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            public void run() {
                updateImage();
            }
        };




    public void updateImage() {

                appInstance.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        int resId = getResources().getIdentifier("image_" + imagePosition, "drawable", appInstance.getPackageName());
                        gifImageViewDummy.setImageResource(resId);
                        imagePosition++;
    //Consider you have 30 image for the anim
                        if (imagePosition == 30) {
//this make animation play only once
                            handler.removeCallbacks(runnable);

                        } else {
    //You can define your own time based on the animation
                            handler.postDelayed(runnable, 50);
                        }

//to make animation to continue use below code and remove above if else
// if (imagePosition == 30)
//imagePosition = 1;
// handler.postDelayed(runnable, 50);
// 
                    }
                });
              }

0

URL থেকে আপনার অ্যাপ্লিকেশন বিন্যাসে সরাসরি অ্যানিমেটেড জিআইএফ প্রদর্শনের সহজ উপায় হ'ল ওয়েবভিউ ক্লাস ব্যবহার করা।

পদক্ষেপ 1: আপনার বিন্যাসে এক্সএমএল

<WebView
android:id="@+id/webView"
android:layout_width="50dp"
android:layout_height="50dp"
/>

পদক্ষেপ 2: আপনার ক্রিয়াকলাপে

WebView wb;
wb = (WebView) findViewById(R.id.webView);
wb.loadUrl("https://.......);

পদক্ষেপ 3: আপনার ম্যানিফেস্টে। এক্সএমএল ইন্টারনেট অনুমতি দিন

<uses-permission android:name="android.permission.INTERNET" />

পদক্ষেপ 4: আপনি যদি নিজের জিআইএফ ব্যাকগ্রাউন্ডটিকে স্বচ্ছ করতে চান এবং আপনার লেআউটের সাথে জিআইএফ ফিট করে তুলতে চান

wb.setBackgroundColor(Color.TRANSPARENT);
wb.getSettings().setLoadWithOverviewMode(true);
wb.getSettings().setUseWideViewPort(true);


কার্যক্ষমতার জন্য ধন্যবাদ তবে যথেষ্ট বিকাশকারী সম্ভবত মেমরি প্রভাব, সিপিইউ ব্যবহার এবং ব্যাটারির আজীবন হিসাবে কিছু জড়িত কারণে অ-নেটিভ রেন্ডার দিতে না চান
রুक्स

-1

আপনি এই লিঙ্কটিতে পাওয়া GifAnimationDrawable লাইব্রেরি ব্যবহার করতে পারেন - https://github.com/Hipmob/gifanimateddrawable , এবং যে কোনও জিআইফকে অ্যানিমেশনড্রাবএলে রূপান্তর করে। উপভোগ করুন :)


-8
public class Test extends GraphicsActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new SampleView(this));
  }

  private static class SampleView extends View {
    private Bitmap mBitmap;
    private Bitmap mBitmap2;
    private Bitmap mBitmap3;
    private Bitmap mBitmap4;
    private Drawable mDrawable;

    private Movie mMovie;
    private long mMovieStart;

    // Set to false to use decodeByteArray
    private static final boolean DECODE_STREAM = true;

    private static byte[] streamToBytes(InputStream is) {
      ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
      byte[] buffer = new byte[1024];
      int len;
      try {
        while ((len = is.read(buffer)) >= 0) {
          os.write(buffer, 0, len);
        }
      } catch (java.io.IOException e) {
      }
      return os.toByteArray();
    }

    public SampleView(Context context) {
      super(context);
      setFocusable(true);

      java.io.InputStream is;
      is = context.getResources().openRawResource(R.drawable.icon);

      BitmapFactory.Options opts = new BitmapFactory.Options();
      Bitmap bm;

      opts.inJustDecodeBounds = true;
      bm = BitmapFactory.decodeStream(is, null, opts);

      // now opts.outWidth and opts.outHeight are the dimension of the
      // bitmap, even though bm is null

      opts.inJustDecodeBounds = false; // this will request the bm
      opts.inSampleSize = 4; // scaled down by 4
      bm = BitmapFactory.decodeStream(is, null, opts);

      mBitmap = bm;

      // decode an image with transparency
      is = context.getResources().openRawResource(R.drawable.icon);
      mBitmap2 = BitmapFactory.decodeStream(is);

      // create a deep copy of it using getPixels() into different configs
      int w = mBitmap2.getWidth();
      int h = mBitmap2.getHeight();
      int[] pixels = new int[w * h];
      mBitmap2.getPixels(pixels, 0, w, 0, 0, w, h);
      mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,
          Bitmap.Config.ARGB_8888);
      mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,
          Bitmap.Config.ARGB_4444);

      mDrawable = context.getResources().getDrawable(R.drawable.icon);
      mDrawable.setBounds(150, 20, 300, 100);

      is = context.getResources().openRawResource(R.drawable.animated_gif);

      if (DECODE_STREAM) {
        mMovie = Movie.decodeStream(is);
      } else {
        byte[] array = streamToBytes(is);
        mMovie = Movie.decodeByteArray(array, 0, array.length);
      }
    }

    @Override
    protected void onDraw(Canvas canvas) {
      canvas.drawColor(0xFFCCCCCC);

      Paint p = new Paint();
      p.setAntiAlias(true);

      canvas.drawBitmap(mBitmap, 10, 10, null);
      canvas.drawBitmap(mBitmap2, 10, 170, null);
      canvas.drawBitmap(mBitmap3, 110, 170, null);
      canvas.drawBitmap(mBitmap4, 210, 170, null);

      mDrawable.draw(canvas);

      long now = android.os.SystemClock.uptimeMillis();
      if (mMovieStart == 0) { // first time
        mMovieStart = now;
      }
      if (mMovie != null) {
        int dur = mMovie.duration();
        if (dur == 0) {
          dur = 1000;
        }
        int relTime = (int) ((now - mMovieStart) % dur);
        mMovie.setTime(relTime);
        mMovie.draw(canvas, getWidth() - mMovie.width(), getHeight()
            - mMovie.height());
        invalidate();
      }
    }
  }
}

class GraphicsActivity extends Activity {
  // set to true to test Picture
  private static final boolean TEST_PICTURE = false;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Override
  public void setContentView(View view) {
    if (TEST_PICTURE) {
      ViewGroup vg = new PictureLayout(this);
      vg.addView(view);
      view = vg;
    }

    super.setContentView(view);
  }
}

class PictureLayout extends ViewGroup {
  private final Picture mPicture = new Picture();

  public PictureLayout(Context context) {
    super(context);
  }

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

  @Override
  public void addView(View child) {
    if (getChildCount() > 1) {
      throw new IllegalStateException(
          "PictureLayout can host only one direct child");
    }

    super.addView(child);
  }

  @Override
  public void addView(View child, int index) {
    if (getChildCount() > 1) {
      throw new IllegalStateException(
          "PictureLayout can host only one direct child");
    }

    super.addView(child, index);
  }

  @Override
  public void addView(View child, LayoutParams params) {
    if (getChildCount() > 1) {
      throw new IllegalStateException(
          "PictureLayout can host only one direct child");
    }

    super.addView(child, params);
  }

  @Override
  public void addView(View child, int index, LayoutParams params) {
    if (getChildCount() > 1) {
      throw new IllegalStateException(
          "PictureLayout can host only one direct child");
    }

    super.addView(child, index, params);
  }

  @Override
  protected LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(LayoutParams.MATCH_PARENT,
        LayoutParams.MATCH_PARENT);
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int count = getChildCount();

    int maxHeight = 0;
    int maxWidth = 0;

    for (int i = 0; i < count; i++) {
      final View child = getChildAt(i);
      if (child.getVisibility() != GONE) {
        measureChild(child, widthMeasureSpec, heightMeasureSpec);
      }
    }

    maxWidth += getPaddingLeft() + getPaddingRight();
    maxHeight += getPaddingTop() + getPaddingBottom();

    Drawable drawable = getBackground();
    if (drawable != null) {
      maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
      maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
    }

    setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
        resolveSize(maxHeight, heightMeasureSpec));
  }

  private void drawPict(Canvas canvas, int x, int y, int w, int h, float sx,
      float sy) {
    canvas.save();
    canvas.translate(x, y);
    canvas.clipRect(0, 0, w, h);
    canvas.scale(0.5f, 0.5f);
    canvas.scale(sx, sy, w, h);
    canvas.drawPicture(mPicture);
    canvas.restore();
  }

  @Override
  protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(mPicture.beginRecording(getWidth(), getHeight()));
    mPicture.endRecording();

    int x = getWidth() / 2;
    int y = getHeight() / 2;

    if (false) {
      canvas.drawPicture(mPicture);
    } else {
      drawPict(canvas, 0, 0, x, y, 1, 1);
      drawPict(canvas, x, 0, x, y, -1, 1);
      drawPict(canvas, 0, y, x, y, 1, -1);
      drawPict(canvas, x, y, x, y, -1, -1);
    }
  }

  @Override
  public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
    location[0] = getLeft();
    location[1] = getTop();
    dirty.set(0, 0, getWidth(), getHeight());
    return getParent();
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    final int count = super.getChildCount();

    for (int i = 0; i < count; i++) {
      final View child = getChildAt(i);
      if (child.getVisibility() != GONE) {
        final int childLeft = getPaddingLeft();
        final int childTop = getPaddingTop();
        child.layout(childLeft, childTop,
            childLeft + child.getMeasuredWidth(),
            childTop + child.getMeasuredHeight());

      }
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.