Files
EhViewer/src/com/hippo/ehviewer/widget/LoadImageView.java
T
2014-05-23 16:38:32 +08:00

180 lines
5.5 KiB
Java

/*
* Copyright (C) 2014 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer.widget;
import com.hippo.ehviewer.ImageGeterManager;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.util.Ui;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.ImageView;
public class LoadImageView extends ImageView {
@SuppressWarnings("unused")
private static final String TAG = "LoadImageView";
public static final int NONE = 0x0;
public static final int LOADING = 0x1;
public static final int LOADED = 0x2;
public static final int FAIL = 0x3;
private static final int WAIT_IMAGE_ID = R.drawable.ic_launcher;
private static final int TOUCH_IMAGE_ID = R.drawable.ic_touch;
private static final int DURATION = 300;
private int mState = NONE;
private String mUrl;
private String mKey;
private static ImageGeterManager mImageGeterManager;
public LoadImageView(Context context) {
super(context);
}
public LoadImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LoadImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setLoadInfo(String url, String key) {
mUrl = url;
mKey = key;
}
public synchronized void setState(int state) {
mState = state;
if (mState != FAIL)
setClickable(false);
}
public void setOnClick() {
setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setClickable(false);
setImageDrawable(null);
mImageGeterManager.add(mUrl, mKey,
ImageGeterManager.DISK_CACHE | ImageGeterManager.DOWNLOAD,
new SimpleImageGetListener(LoadImageView.this));
}
});
}
public String getUrl() {
return mUrl;
}
public String getKey() {
return mKey;
}
public synchronized int getState() {
return mState;
}
public void setWaitImage() {
setImageResource(WAIT_IMAGE_ID);
}
public void setTouchImage() {
setImageResource(TOUCH_IMAGE_ID);
}
/**
* Load target bmp, set progressive animation
* @param bmp
*/
public void setContextImage(Bitmap bmp) {
Drawable[] layers = new Drawable[2];
layers[0] = Ui.transparentDrawable;
layers[1] = new BitmapDrawable(getContext().getResources(), bmp);
TransitionDrawable transitionDrawable = new TransitionDrawable(layers);
setImageDrawable(transitionDrawable);
transitionDrawable.startTransition(DURATION);
// I get no idea which is better
/*
setImageBitmap(bmp);
AlphaAnimation aa = new AlphaAnimation(0.0f,1.0f);
aa.setDuration(DURATION);
startAnimation(aa);
*/
}
public static void setImageGeterManager(ImageGeterManager i) {
mImageGeterManager = i;
}
public static class SimpleImageGetListener
implements ImageGeterManager.OnGetImageListener {
private LoadImageView mLiv;
public SimpleImageGetListener(LoadImageView liv) {
mLiv = liv;
}
public boolean isVaild(String key) {
return key.equals(mLiv.getKey())
&& mLiv.getParent() != null;
}
@Override
public boolean onGetImageStart(String key) {
boolean re = isVaild(key) && (mLiv.getState() == LoadImageView.NONE ||
mLiv.getState() == LoadImageView.FAIL);
if (re)
mLiv.setState(LoadImageView.LOADING);
return re;
}
@Override
public void onGetImageFail(String key) {
if (isVaild(key) && mLiv.getState() == LoadImageView.LOADING) {
mLiv.setTouchImage();
mLiv.setOnClick();
mLiv.setState(LoadImageView.FAIL);
}
}
@Override
public void onGetImageSuccess(String key, Bitmap bmp, int mode) {
if (isVaild(key) && mLiv.getState() == LoadImageView.LOADING) {
if (mode == ImageGeterManager.MEMORY_CACHE
|| mode == ImageGeterManager.DISK_CACHE)
mLiv.setImageBitmap(bmp);
else if (mode == ImageGeterManager.DOWNLOAD) {
mLiv.setContextImage(bmp);
}
mLiv.setState(LoadImageView.LOADED);
}
}
}
}