1. 程式人生 > >安卓實現廣告欄圖片無限輪播播放效果

安卓實現廣告欄圖片無限輪播播放效果


//經常在安卓app中頁面上方放置一個廣告欄,用到的無限輪播程式碼:

public class MainActivity extends Activity {
// 廣告控制元件
private MyPagerGalleryView gallery;
// 圓點容器
private LinearLayout ovalLayout;
// 圖片上面的文字
private TextView adgallerytxt;
/** 圖片id的陣列,本地測試用 */
private int[] imageId = new int[] { R.drawable.img02, R.drawable.img03,
R.drawable.img07 , R.drawable.img06, R.drawable.img09};
private String[] txtViewpager = { "天下美景","人間仙境","綠野仙蹤","美輪美奐","醉裡夢影"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gallery = (MyPagerGalleryView) findViewById(R.id.adgallery); // 獲取Gallery元件
ovalLayout = (LinearLayout) findViewById(R.id.ovalLayout1);// 獲取圓點容器
adgallerytxt = (TextView) findViewById(R.id.adgallerytxt);
gallery.start(this, imageId, 3000, ovalLayout,
R.drawable.dot_focused, R.drawable.dot_normal, adgallerytxt,
txtViewpager);
gallery.setMyOnItemClickListener(new MyOnItemClickListener() {
public void onItemClick(int curIndex) {
Toast.makeText(MainActivity.this, "點選的圖片下標為:" + curIndex,
Toast.LENGTH_SHORT).show();
// System.out.println(curIndex);
}
});

}


@Override
protected void onStop() {
gallery.stopTimer();
super.onStop();
}


@Override
protected void onRestart() {
gallery.startTimer();
super.onRestart();
}


}

//主函式佈局檔案如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >


    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >


            <LinearLayout
                android:id="@+id/qweqweqweqwe"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >


                <com.example.guanggaolan.MyPagerGalleryView
                    android:id="@+id/adgallery"
                    android:layout_width="match_parent"
                    android:layout_height="200dip"
                    android:background="#FFFFFF"
                    android:focusable="true"
                    android:focusableInTouchMode="true" />
            </LinearLayout>


            <RelativeLayout 
               android:layout_width="match_parent"
                android:layout_height="60dip"
                android:layout_alignBottom="@+id/qweqweqweqwe"
                android:background="@drawable/progresslayout_bg" 
                >
            <TextView
                android:id="@+id/adgallerytxt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="20dip"                
                android:textColor="#cecece"
                android:textSize="18sp"
                android:text="廣告" />
</RelativeLayout>
            <LinearLayout
                android:id="@+id/ovalLayout1"
                android:layout_width="match_parent"
                android:layout_height="10dip"
                android:layout_below="@+id/qweqweqweqwe"
                android:background="#00FFFFFF"
                android:gravity="center"
                android:orientation="horizontal" >
            </LinearLayout>
        </RelativeLayout>
    </ScrollView>


</LinearLayout>

//需要的工具類:

/**
 * 無限滾動廣告欄元件
 */
@SuppressWarnings("deprecation")
public class MyPagerGalleryView extends Gallery implements
android.widget.AdapterView.OnItemClickListener,
android.widget.AdapterView.OnItemSelectedListener, OnTouchListener {
/** 顯示的Activity */
private Context mContext;
/** 條目單擊事件介面 */
private MyOnItemClickListener mMyOnItemClickListener;
/** 圖片切換時間 */
private int mSwitchTime;
/** 自動滾動的定時器 */
private Timer mTimer;
/** 圓點容器 */
private LinearLayout mOvalLayout;
/** 當前選中的陣列索引 */
private int curIndex = 0;
/** 上次選中的陣列索引 */
private int oldIndex = 0;
/** 圓點選中時的背景ID */
private int mFocusedId;
/** 圓點正常時的背景ID */
private int mNormalId;
/** 圖片資源ID組 */
private int[] mAdsId;

/** ImageView組 */
private List<ImageView> listImgs;
/** 廣告條上面textView控制元件 */
private TextView adgallerytxt;
/** 廣告條上的每一條文字的陣列 */
private String[] txtViewpager;


public MyPagerGalleryView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}


public MyPagerGalleryView(Context context) {
super(context);
}


public MyPagerGalleryView(Context context, AttributeSet attrs) {
super(context, attrs);
}


/**
* @param context
*            顯示的Activity ,不能為null
* @param adsId
*            圖片組資源ID ,測試用
* @param switchTime
*            圖片切換時間 寫0 為不自動切換
* @param ovalLayout
*            圓點容器 ,可為空
* @param focusedId
*            圓點選中時的背景ID,圓點容器可為空寫0
* @param normalId
*            圓點正常時的背景ID,圓點容器為空寫0
* @param adgallerytxt
*            廣告條上面textView控制元件
* @param txtViewpager
*            廣告條上的每一條文字的陣列

*/
public void start(Context context, int[] adsId,
int switchTime, LinearLayout ovalLayout, int focusedId,
int normalId, TextView adgallerytxt, String[] txtViewpager) {
this.mContext = context;
this.mAdsId = adsId;
this.mSwitchTime = switchTime;
this.mOvalLayout = ovalLayout;
this.mFocusedId = focusedId;
this.mNormalId = normalId;
this.adgallerytxt = adgallerytxt;
this.txtViewpager = txtViewpager;


ininImages();// 初始化圖片組
setAdapter(new AdAdapter());
this.setOnItemClickListener(this);
this.setOnTouchListener(this);
this.setOnItemSelectedListener(this);
setSpacing(0);
setFocusableInTouchMode(true);
initOvalLayout();// 初始化圓點
startTimer();// 開始自動滾動任務
}


/** 初始化圖片組 */
private void ininImages() {
listImgs = new ArrayList<ImageView>(); // 圖片組
int len =mAdsId.length;
for (int i = 0; i < len; i++) {
ImageView imageview = new ImageView(mContext); // 例項化ImageView的物件
imageview.setScaleType(ImageView.ScaleType.FIT_XY); // 設定縮放方式
imageview.setLayoutParams(new Gallery.LayoutParams(
Gallery.LayoutParams.MATCH_PARENT,
Gallery.LayoutParams.MATCH_PARENT));
// 本地載入圖片
imageview.setImageResource(mAdsId[i]); // 為ImageView設定要顯示的圖片
listImgs.add(imageview);
}


}


/** 初始化圓點 */
private void initOvalLayout() {


if (mOvalLayout != null && listImgs.size() < 2) {// 如果只有一第圖時不顯示圓點容器
mOvalLayout.removeAllViews();
mOvalLayout.getLayoutParams().height = 0;
} else if (mOvalLayout != null) {
mOvalLayout.removeAllViews();
// 圓點的大小是 圓點視窗的 70%;
int Ovalheight = (int) (mOvalLayout.getLayoutParams().height * 0.7);
// 圓點的左右外邊距是 圓點視窗的 20%;
int Ovalmargin = (int) (mOvalLayout.getLayoutParams().height * 0.2);
android.widget.LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
Ovalheight, Ovalheight);
layoutParams.setMargins(Ovalmargin, 0, Ovalmargin, 0);
for (int i = 0; i < listImgs.size(); i++) {
View v = new View(mContext); // 員點
v.setLayoutParams(layoutParams);
v.setBackgroundResource(mNormalId);
mOvalLayout.addView(v);
}
// 選中第一個
mOvalLayout.getChildAt(0).setBackgroundResource(mFocusedId);
}
}


/** 無限迴圈介面卡 */
class AdAdapter extends BaseAdapter {
@Override
public int getCount() {
if (listImgs.size() < 2)// 如果只有一張圖時不滾動
return listImgs.size();
return Integer.MAX_VALUE;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
return listImgs.get(position % listImgs.size()); // 返回ImageView
}


@Override
public Object getItem(int position) {
return null;
}


@Override
public long getItemId(int position) {
return position;
}
}


public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
int kEvent;
if (isScrollingLeft(e1, e2)) { // 檢查是否往左滑動
kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
} else { // 檢查是否往右滑動
kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
}
onKeyDown(kEvent, null);
return true;


}


/** 檢查是否往左滑動 */
private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
return e2.getX() > (e1.getX() + 50);
}


@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return super.onScroll(e1, e2, distanceX, distanceY);
}


@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_UP == event.getAction()
|| MotionEvent.ACTION_CANCEL == event.getAction()) {
startTimer();// 開始自動滾動任務
} else {
stopTimer();// 停止自動滾動任務
}
return false;
}


/** 圖片切換事件 */
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position,
long arg3) {
curIndex = position % listImgs.size();
if (mOvalLayout != null && listImgs.size() > 1) { // 切換圓點
mOvalLayout.getChildAt(oldIndex).setBackgroundResource(mNormalId); // 圓點取消
mOvalLayout.getChildAt(curIndex).setBackgroundResource(mFocusedId);// 圓點選中
adgallerytxt.setText("" + txtViewpager[curIndex]);
oldIndex = curIndex;
}
// adgallerytxt.setText("" + curIndex);
}


@Override
public void onNothingSelected(AdapterView<?> arg0) {
}


/** 專案點選事件 */
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
if (mMyOnItemClickListener != null) {
mMyOnItemClickListener.onItemClick(curIndex);
}
}


/** 設定專案點選事件監聽器 */
public void setMyOnItemClickListener(MyOnItemClickListener listener) {
mMyOnItemClickListener = listener;
}


/** 專案點選事件監聽器介面 */
public interface MyOnItemClickListener {
/**
* @param curIndex
*            //當前條目在陣列中的下標
*/
void onItemClick(int curIndex);
}


/** 停止自動滾動任務 */
public void stopTimer() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
}


/** 開始自動滾動任務 圖片大於1張才滾動 */
public void startTimer() {
if (mTimer == null && listImgs.size() > 1 && mSwitchTime > 0) {
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
public void run() {
handler.sendMessage(handler.obtainMessage(1));
}
}, mSwitchTime, mSwitchTime);
}
}


/** 處理定時滾動任務 */
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 不包含spacing會導致onKeyDown()失效!!!
// 失效onKeyDown()前先呼叫onScroll(null,1,0)可處理
onScroll(null, null, 1, 0);
onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
};
}