Android Gallery用法(自定义边框+底部小圆点)

最近在项目中用到图片轮播,试了Gallery,ViewFlipper,ViewPager,感觉Gallery最符合需求,但是Gallery的系统边框很难看,项目中要求用自己的背景图片。

下面来看一下使用Gallery实现图片轮播

运行效果:


布局文件:

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="10dp" >

        <Gallery
            android:id="@+id/gallery"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:fadingEdge="none"
            android:spacing="0dp" />

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="18dp"
            android:layout_gravity="bottom"
            android:layout_marginBottom="3dp"
            android:layout_marginLeft="3dp"
            android:layout_marginRight="3dp"
            android:background="#80776f63"
            android:gravity="center" >

            <ImageView
                android:id="@+id/dot_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_dot_normal" />

            <ImageView
                android:id="@+id/dot_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_toRightOf="@+id/dot_1"
                android:src="@drawable/ic_dot_normal" />

            <ImageView
                android:id="@+id/dot_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_toRightOf="@+id/dot_2"
                android:src="@drawable/ic_dot_normal" />
        </RelativeLayout>
    </FrameLayout>
其中, android:fadingEdge="none"消除图片两边的阴影。使用FrameLayout在底部显示小圆点

public class MainActivity extends Activity {

	private Gallery mGallery;
	private int index = 0;// 记录选中的图片位置
	private ImageView[] mImageViewIds;// 小圆点ImageView数组
	private static final int IMAGE_COUNT = 3;// 小圆点个数

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		findViews();
		mImageViewIds[0].setImageDrawable(getBaseContext().getResources()
				.getDrawable(R.drawable.ic_dot_focused));
		ImageAdapteradapter = new ImageAdapter(this);
		mGallery.setAdapter(adapter);
		Timer timer = new Timer();
		timer.schedule(task, 2000, 2000);
		mGallery.setOnItemSelectedListener(onItemSelectedListener);
		mGallery.setOnItemClickListener(onItemClickListener);
	}

	private void findViews() {
		mGallery = (Gallery) findViewById(R.id.gallery);
		mImageViewIds = new ImageView[] { (ImageView) findViewById(R.id.dot_1),
				(ImageView) findViewById(R.id.dot_2),
				(ImageView) findViewById(R.id.dot_3) };
	}

	private TimerTask task = new TimerTask() {

		@Override
		public void run() {
			Message message = new Message();
			message.what = 2;
			index = mGallery.getSelectedItemPosition();
			index++;
			handler.sendMessage(message);
		}
	};

	/**
	 * 开一个线程执行耗时操作
	 */
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case 2:
				mGallery.setSelection(index);
				break;
			default:
				break;
			}
		}

	};
	/**
	 * 设置小圆点显示,position会一直增加,如果要循环显示图片,需要对position取余,否则数组越界
	 */
	private OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			int pos = position % IMAGE_COUNT;
			mImageViewIds[pos].setImageDrawable(getBaseContext().getResources()
					.getDrawable(R.drawable.ic_dot_focused));
			if (pos > 0) {
				mImageViewIds[pos - 1].setImageDrawable(getBaseContext()
						.getResources().getDrawable(R.drawable.ic_dot_normal));
			}
			if (pos < (IMAGE_COUNT - 1)) {
				mImageViewIds[pos + 1].setImageDrawable(getBaseContext()
						.getResources().getDrawable(R.drawable.ic_dot_normal));
			}
			if (pos == 0) {
				mImageViewIds[IMAGE_COUNT - 1]
						.setImageDrawable(getBaseContext().getResources()
								.getDrawable(R.drawable.ic_dot_normal));
			}
		}

		@Override
		public void onNothingSelected(AdapterView<?> arg0) {
			// TODO Auto-generated method stub

		}
	};

	/**
	 * 点击事件,点击图片进入SecondActivity
	 */
	private OnItemClickListener onItemClickListener = new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
				long arg3) {
			Intent intent = new Intent();
			intent.setClass(MainActivity.this, SecondActivity.class);
			startActivity(intent);
		}
	};
}
ImageAdapter类,重写android.widget.BaseAdapter,用于描述图像信息。
public class ImageAdapter extends BaseAdapter {
	private Context context;
	private int[] mImages = { R.drawable.bg_timeline_01,
			R.drawable.bg_timeline_02, R.drawable.bg_timeline_03 };
	private static final int IMAGE_PX_HEIGHT = 198;

	public ImageAdapter(Context context) {
		this.context = context;
	}

	@Override
	public int getCount() {
		return Integer.MAX_VALUE;//实现循环显示
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageView = new ImageView(context);
		imageView.setImageResource(mImages[position % mImages.length]);
		imageView.setScaleType(ImageView.ScaleType.CENTER);
		imageView.setLayoutParams(new Gallery.LayoutParams(
				Gallery.LayoutParams.FILL_PARENT, IMAGE_PX_HEIGHT));

		RelativeLayout borderImg = new RelativeLayout(context);
		borderImg.setPadding(2, 2, 2, 2);
		borderImg.setBackgroundResource(R.drawable.bg_gallery);//设置ImageView边框
		borderImg.addView(imageView);
		return borderImg;
	}

}

如果用系统背景,可以这样写

int mGalleryItemBackground;
private Context mContext;
 
public ImageAdapter(Context context)
{
mContext = context;
// 获得Gallery组件的属性
TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
mGalleryItemBackground = typedArray.getResourceId(
R.styleable.Gallery_android_galleryItemBackground, 0); 
}
在getview中设置

imageView.setBackgroundResource(mGalleryItemBackground);
Gallery组件属性信息定义在res\values\attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Gallery">
<attr name="android:galleryItemBackground" />
</declare-styleable>
</resources>
详细讲解见 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=182297

自定义边框参考http://stackoverflow.com/questions/4830173/change-border-style-in-gallery

下面是控制gallery滑动过快的方法,重写gallery的手势操作

public class MyGallery extends Gallery {
	public MyGallery(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public MyGallery(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
		return e2.getX() > e1.getX();
	}

	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		int keyCode;
		if (isScrollingLeft(e1, e2)) {
			keyCode = KeyEvent.KEYCODE_DPAD_LEFT;
		} else {
			keyCode = KeyEvent.KEYCODE_DPAD_RIGHT;
		}
		onKeyDown(keyCode, null);
		return true;
	}
}

源码下载地址: http://download.csdn.net/detail/welovesunflower/6910441



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值