まず第一に、アプリケーションが UI とのやり取りが激しい場合、そのサイズはそれほど悪くありません。また、しばらくすると、ユーザーはそのドローアブルをダウンロードする必要がありますが、Google プレイストアからインストールしないのはなぜですか?. とにかく、本当にやりたい場合は、次のことができます。
レイアウトで参照するには、ドローアブルへの参照を持つすべてのウィジェットから接続し、独自のタグを実装する必要があります。たとえば、古いレイアウトが次のようになっているとします。
<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"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/someImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/somePicture" />
</RelativeLayout>
次のようになります。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.example.custom"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<com.example.custom.RemoteImageView
android:id="@+id/someImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
custom:remoteSrc="somePicture" />
</RelativeLayout>
にカスタム タグ定義を追加することを忘れないでくださいattrs.xml
。クラスの実装では、次のようなキャッシュから画像 (存在する場合) を取得できます。
public class RemoteImageView extends ImageView {
private String remoteSrc;
private DiskLruImageCache diskCache;
public RemoteImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public RemoteImageView(Context context, AttributeSet attrs) {
super(context, attrs);
diskCache = new DiskLruImageCache(this, "cache", 1024 * 1024 * 30, CompressFormat.PNG, 70);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.RemoteImageView, 0, 0);
try {
remoteSrc = a.getString(R.styleable.RemoteImageView_remoteSrc);
Bitmap cachedImage;
if (!diskCache.containsKey(remoteSrc)) {
//Download it from Internet and save it into the cache
//...
diskCache.put(remoteSrc, bitmapThatYouDownload);
}
cachedImage = diskCache.getBitmap(remoteSrc);
//Use the cachedImage as the bitmap for this view.
} finally {
a.recycle();
}
}
public RemoteImageView(Context context) {
super(context);
}
}
あなたについてDiskLruImageCache
確認するには、次のリンクを確認してください。
DiskLruCache
これを使用して、2 レベルのキャッシュを使用するなど、いくつかのトリックを実行できます。最初のキャッシュはメモリ キャッシュで、2 番目のキャッシュはディスク キャッシュです。このようなことを行うライブラリはすでに存在しますが、カスタムタグが必要な場合は、これらのライブラリを変更するか、上記で示したようにクラスでキャッシュライブラリを使用できます.
のようなアニメーション リストについてはAnimationDrawable
、実行時にアニメーションをビルドする必要があります。たとえば、次のようにします。
AnimationDrawable animation = new AnimationDrawable();
animation.addFrame(new BitmapDrawable(getResources(),diskCache.get(myFirstFreame)), 100);
animation.addFrame(new BitmapDrawable(getResources(),diskCache.get(mySecondFrame)), 1000);
animation.addFrame(new BitmapDrawable(getResources(),diskCache.get(myThirdFrame)), 1000);
animation.setOneShot(false);
ImageView imageAnim = (ImageView) findViewById(R.id.img);
imageAnim.setBackgroundDrawable(animation);
とがすでにキャッシュにあるmyFirstFrame
かどうかを確認してください。そうでない場合は、それらをダウンロードして追加します。mySecondFrame
myThirdFrame
この助けを願っていますが、私があなただったら、そのサイズを維持します.