一、思路就是在一个layout里面放两个Imageiew,通过animation实现上下或者左右切换,启动一个线程每隔一段时间通知切换子视图实现自动翻转。同时注册一个callback,实现图片可以响应自定义的事件。
二、自定义的view
package com.android.adshow;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutionException;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;
import com.longyuan.pad.ad.service.Ad;
public class AdShowViewGroup extends FrameLayout {
private final String TAG = "AdShowViewGroup";
private HashMap<String, SoftReference<Drawable>> cacheMap;
private final int VIEW_COUNTS = 2;
private List<Ad> mDatas;
private ImageView[] mImageView;
private Context mContext;
private int currentPosition = 0;
private int nextPosition = 1;
private int index=0;
private int next_index=1;
private int currentIndex=0;
private boolean isStop = false;
private Animation animation_out;
private Animation animation_in;
private OnClickListener mListener;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch(msg.what){
case 0:
showNext();
break;
}
};
};
public AdShowViewGroup(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// FIXME Auto-generated constructor stub
initialize(context);
}
public AdShowViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
// FIXME Auto-generated constructor stub
initialize(context);
}
public AdShowViewGroup(Context context) {
super(context);
// FIXME Auto-generated constructor stub
initialize(context);
}
private void initialize(Context context){
mContext = context;
mImageView = new ImageView[VIEW_COUNTS];
int len = mImageView.length;
for(int i=0;i<len;i++){
mImageView[i] = new ImageView(mContext);
mImageView[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// FIXME Auto-generated method stub
mListener.onClick(currentPosition);
Toast.makeText(mContext, "currentPosition = "+currentPosition, Toast.LENGTH_LONG).show();
}
});
if(i==0){
this.addView(mImageView[i], new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
}else{
mImageView[i].setVisibility(View.GONE);
this.addView(mImageView[i], new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
}
}
mDatas = new ArrayList<Ad>();
cacheMap = new HashMap<String, SoftReference<Drawable>>();
animation_in = AnimationUtils.loadAnimation(mContext, R.anim.view_enter);
animation_out = AnimationUtils.loadAnimation(mContext, R.anim.view_exit);
}
public void setDatas(List<Ad> list){
if(list!=null)
mDatas.addAll(list);
}
public void initViews(){
try {
mImageView[index].setImageDrawable((new AsyncTaskLoadImg().execute(mDatas.get(currentPosition).getUrl_v()).get()));
mImageView[next_index].setImageDrawable((new AsyncTaskLoadImg().execute(mDatas.get(currentPosition+1).getUrl_v()).get()));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
private void showNext(){
mImageView[currentIndex].startAnimation(animation_out);
mImageView[currentIndex].setVisibility(View.GONE);
mImageView[(currentIndex+1)%2].startAnimation(animation_in);
mImageView[(currentIndex+1)%2].setVisibility(View.VISIBLE);
animation_in.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// FIXME Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// FIXME Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// FIXME Auto-generated method stub
currentIndex = (currentIndex+1)%2;
int len = mDatas.size();
currentPosition=(++currentPosition)%len;
nextPosition = (currentPosition+1)%len;
try {
String url = mDatas.get(nextPosition).getUrl_v();
Drawable drawable = getDrawableByUrl(url);
if(drawable!=null){
mImageView[(currentIndex+1)%2].setImageDrawable(drawable);
}else{
mImageView[(currentIndex+1)%2].setImageDrawable((new AsyncTaskLoadImg().execute(url).get()));
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
});
}
private Drawable getDrawableByUrl(String url){
if(cacheMap!=null && cacheMap.containsKey(url)){
SoftReference<Drawable> sr = cacheMap.get(url);
return sr.get();
}
return null;
}
public void setStop(boolean isStop) {
this.isStop = isStop;
}
public void startPlay(){
new Thread(new AutoPlayRunnable()).start();
}
public void setOnClickListener(OnClickListener listener){
mListener = listener;
}
public interface OnClickListener{
void onClick(int position);
}
private class AutoPlayRunnable implements Runnable{
@Override
public void run() {
// FIXME Auto-generated method stub
while(!isStop){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// FIXME Auto-generated catch block
e.printStackTrace();
}finally{
handler.sendEmptyMessage(0);
}
}
}
}
private class AsyncTaskLoadImg extends AsyncTask<String , Void, Drawable> {
private String urlStr;
@Override
protected Drawable doInBackground(String... params) {
// FIXME Auto-generated method stub
if(params.length>0){
HttpURLConnection conn = null;
Drawable drawable = null;
try {
urlStr = params[0];
URL url = new URL(urlStr);
conn = (HttpURLConnection) url
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
drawable = Drawable.createFromStream(stream, "img");
} catch (MalformedURLException e) {
// FIXME Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// FIXME Auto-generated catch block
e.printStackTrace();
}finally{
if(conn!=null){
conn.disconnect();
conn = null;
}
return drawable;
}
}
return null;
}
@Override
protected void onPostExecute(Drawable result) {
// FIXME Auto-generated method stub
super.onPostExecute(result);
if(cacheMap!=null)
cacheMap.put(urlStr, new SoftReference<Drawable>(result));
}
}
}
三、测试DemoActivity
测试代码就不上了,比较简单。