一日项目要实现这个功能,我也不知道如何实现,从网上搜了一大堆,好像没有现成的demo,后来无意间从eoe论坛上看到一个帖子,贴出了解决方案和思路,
我也顺利实现了该功能。
解决思路是这样的:重写在Gallery下面View(xml布局在Gallery下),画出和相片数量相当的圆点,当前选中的是那个相片,就在对应position的位置将那个圆点绘制成两点。
绘制圆点主要就是重写onDraw函数。
代码:
xml:
android:layout_width="fill_parent" android:layout_height="fill_parent">
android:layout_height="wrap_content"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
重写的View代码:
package com.example.android.apis.view;
import com.example.android.apis.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class PageIndicatorView extends View {
private String TAG = "PageIndicatorView";
private int mCurrentPage = -1;
private int mTotalPage = 0;
public PageIndicatorView(Context context) {
super(context);
}
public PageIndicatorView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setTotalPage(int nPageNum) {
mTotalPage = nPageNum;
if (mCurrentPage >= mTotalPage)
mCurrentPage = mTotalPage - 1;
}
public int getCurrentPage() {
return mCurrentPage;
}
public void setCurrentPage(int nPageIndex) {
if (nPageIndex < 0 || nPageIndex >= mTotalPage)
return;
if (mCurrentPage != nPageIndex) {
mCurrentPage = nPageIndex;
this.invalidate();
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.d(TAG, "on draw...");
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
Rect r = new Rect();
this.getDrawingRect(r);
int iconWidth = 9;
int iconHeight = 9;
int space = 12;
int x = (r.width() - (iconWidth * mTotalPage + space * (mTotalPage - 1))) / 2;
int y = (r.height() - iconHeight) / 2;
for (int i = 0; i < mTotalPage; i++) {
int resid = R.drawable.dot_selected;
if (i == mCurrentPage) {
resid = R.drawable.dot_unselected;
}
Rect r1 = new Rect();
r1.left = x;
r1.top = y;
r1.right = x + iconWidth;
r1.bottom = y + iconHeight;
Bitmap bmp = BitmapFactory.decodeResource(getResources(), resid);
canvas.drawBitmap(bmp, null, r1, paint);
x += iconWidth + space;
}
}
}
界面代码:
/*
* Copyright (C) 2007 The Android Open Source Project
*
* 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.example.android.apis.view;
import com.example.android.apis.R;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
public class Gallery1 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallery_1);
// Reference the Gallery view
Gallery g = (Gallery) findViewById(R.id.gallery);
final PageIndicatorView mPageView = (PageIndicatorView)findViewById(R.id.pageView);
mPageView.setTotalPage(8);
// Set the adapter to our custom adapter (below)
g.setAdapter(new ImageAdapter(this));
g.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> arg0, View arg1, int arg2,
long arg3) {
mPageView.setCurrentPage(arg2);
Toast.makeText(Gallery1.this, "select" + arg2, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView> arg0) {
// TODO Auto-generated method stub
}
});
// Set a item click listener, and just Toast the clicked position
g.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
// Toast.makeText(Gallery1.this, "" + position, Toast.LENGTH_SHORT).show();
mPageView.setCurrentPage(position);
}
});
// We also want to show context menu for longpressed items in the gallery
registerForContextMenu(g);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add(R.string.gallery_2_text);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Toast.makeText(this, "Longpress: " + info.position, Toast.LENGTH_SHORT).show();
return true;
}
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
public ImageAdapter(Context c) {
mContext = c;
// See res/values/attrs.xml for the
// Gallery1.
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
mGalleryItemBackground = a.getResourceId(
R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
public int getCount() {
return mImageIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mImageIds[position]);
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setLayoutParams(new Gallery.LayoutParams(160, 120));
// The preferred Gallery item background
i.setBackgroundResource(mGalleryItemBackground);
return i;
}
private Context mContext;
private Integer[] mImageIds = {
R.drawable.gallery_photo_1,
R.drawable.gallery_photo_2,
R.drawable.gallery_photo_3,
R.drawable.gallery_photo_4,
R.drawable.gallery_photo_5,
R.drawable.gallery_photo_6,
R.drawable.gallery_photo_7,
R.drawable.gallery_photo_8
};
}
}