HardBirch

自定义动态标识控件

时间:12-06-12 栏目:安卓源码解析与小应用 作者:张飞不张,文采横飞 评论:13 点击: 4,849 次

         马上就开始欧洲杯法国对英格兰的比赛了,忙了一个多小时,把代码整理整理,能拿出来见世面了,一直想实现这个功能,记得刚工作几个月的时候,要修改launcher,有个功能就是界面的屏幕数是可以动态的增减,想了很久,没有想出来方法。最近有有个功能需要,感谢阎老师的帮助,自己又把代码整理了一下,把功能给独立了出来,达到可以复用的效果。

      今天在网上找东西的时候,发现有很多自己上传的csdn的代码被上传到很多网站,而且还都是以aomandeshangxiao的名义,感觉有些好玩,好吧,本为aomandeshangxiao原创。博客地址:http://write.blog.csdn.net/postlist

        开始正事吧,开始代码:

先看下xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <Gallery
        android:id="@+id/gallery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <MarkView
        android:id="@+id/markView"
		android:layout_below="@+id/gallery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
		/>

</RelativeLayout>

看到了MarkView,这个就是自定义的控件:

public class MarkView extends LinearLayout {
	private ImageView[] mImageView;
	private Context context;

	public MarkView(Context context){
		super(context);
		this.context = context;

	}

	public MarkView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
	}

	public void setMarkCount(int iCount) {
		mImageView = new ImageView[iCount];
		LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		p.setMargins(5, 0, 0, 0);
		for (int i = 0; i < iCount; i++) {
			ImageView image = new ImageView(context);
			image.setImageResource(R.drawable.unselected_dot);
			image.setLayoutParams(p);
			mImageView[i] = image;
			image.setId(i);
			addView(image);
		}
	}

	public void setMark(int position) {
		for (int i = 0; i < mImageView.length; i++) {
			if (i == position) {
				mImageView[i].setImageResource(R.drawable.select_dot);
			} else {
				mImageView[i].setImageResource(R.drawable.unselected_dot);
			}
		}
	}

}

代码比较简单,控件继承自LinearLayout。

       有两个方法,基本上看代码就可以看懂,在最后会把代码上传提供下载。

看一下应用:

public class GalleryDemoActivity extends Activity {
	/** Called when the activity is first created. */
	private Gallery gallery;
	private List<Integer> list;
	private MarkView markView;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		gallery = (Gallery)findViewById(R.id.gallery);
		markView = (MarkView)findViewById(R.id.markView);
		list = new ArrayList<Integer>();
		int[] images = new int[]{R.drawable.chrysanthemum,R.drawable.desert,R.drawable.dustbox,
				R.drawable.hydrangeas,R.drawable.penguins};
		for(int i = 0 ;i < images.length; i++){
			list.add(images[i]);
		}
		//设置标记个数
		markView.setMarkCount(list.size());
		GalleryAdapter adapter = new GalleryAdapter(list);
		gallery.setAdapter(adapter);

		gallery.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,int position, long id) {
				markView.setMark(position);
			}

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

			}
		});

	}

	private class GalleryAdapter extends BaseAdapter{

		private List<Integer> bitMapList;
		public GalleryAdapter(List<Integer> list){
			this.bitMapList = list;
		}

		@Override
		public int getCount() {
			return bitMapList.size();
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView imageView = new ImageView(GalleryDemoActivity.this);
			imageView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, 400));
			imageView.setImageResource(list.get(position));
			return imageView;
		}

	}
}

       在这个例子中,数组是定的,在一些应用中,页面个数或者图片个数不定,使用MarkView这个控件就可以动态的调整标识的个数。英格兰队进球了,比赛应该更好看了。


      最后代码下载地址:

http://download.csdn.net/detail/aomandeshangxiao/4367261

可以好好看球了。。

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: 自定义动态标识控件

自定义动态标识控件:目前有13 条留言

  1. 13楼
    also456:

    源代码跑起来会报错……..

    2012-06-12 09:22 [回复]
  2. [reply]also456[/reply]
    不是吧,我运行成功以后才上传的阿?哪报错了阿???

    2012-06-12 09:53 [回复]
  3. 11楼
    fjbperfect:

    我还以为是launcher增加屏幕代码。。。。
    建议gallery重写onFling,去控制滑动速度

    2012-06-12 09:59 [回复]
  4. 10楼
    fjbperfect:

    [reply]aomandeshangxiao[/reply]
    呵呵,main.xml第10行,将MarkView改成cn.demo.MarkView,不然系统找不到的

    2012-06-12 10:01 [回复]
  5. [reply]fjbperfect[/reply]
    哦,原先是加上的,我想看看去掉行不行,恩,应该是加上包名的。

    2012-06-12 11:12 [回复]
  6. [reply]fjbperfect[/reply]
    呵呵,不是,主要是一个小标示空间,gallery主要只是演示。重要的是下面的标示。。。

    2012-06-12 11:13 [回复]
  7. [reply]wo2995059477[/reply]
    呵呵,改进意见非常好,但是不知道为什么后面给我个没用的链接。

    2012-06-12 14:35 [回复]
  8. 6楼
    manoel:

    兄弟,布局里面包名要用全路径才行。挺好的,学习了,呵呵。就是感觉不太流畅。重写一个viewgroup,效果应该能好一些。

    2012-06-12 15:38 [回复]
  9. [reply]manoel[/reply]
    恩,是阿,非常恶心,那个gallery为什么这样子,弄到半夜也烦了,就看球去了。不过那个东西简单的还可以用。

    2012-06-12 16:24 [回复]
  10. 4楼
    zmyde2010:

    顶一个

    2012-06-12 18:54 [回复]
  11. 贴上效果图就好了。

    2012-06-12 21:08 [回复]
  12. [reply]zmyde2010[/reply]
    谢谢。。。。

    2012-06-12 21:47 [回复]
  13. [reply]AndroidBluetooth[/reply]
    下个代码 自己跑一下就可以了,挺简单的。。。

    2012-06-12 21:47 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐