自定義一個可以自動循環顯示圖片的Demo

一、思路就是在一個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

測試代碼就不上了,比較簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章