首先,如果您的应用程序具有密集的 ui 交互,那么该大小还不错。此外,在某些时候用户需要下载该drawables,为什么不从google playstore 安装呢?无论如何,如果您真的想这样做,您可以执行以下操作:
对于您的布局中的引用,您需要从每个具有对可绘制对象的引用的小部件中连接并实现您自己的标签。例如,如果您的旧布局如下所示:
<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
你可以用这个做一些技巧,比如有一个两级缓存,第一个有内存缓存,第二个有磁盘缓存。已经存在执行此类操作的库,但是您如何需要自定义标签,您可以修改这些库或在您的类中使用缓存库,就像我在上面向您展示的那样。
对于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
是否已经在缓存中。如果没有,则下载并添加它们。
希望这对您有所帮助,但如果我是你,我会保持这个大小,个人不是那么多,我开发了一个具有很多动画和 ui 功能的 tumblr 客户端,apk 大小约为 15 MiB。