如何在xml中配置自定义view以及使view动起来


是一个关于在activity中加载view的代码,要知道,当你的activity中已经加载了布局文件,就不能再用setContentView的形式了(如有大神能这样解决请不吝赐教,我没有这样的解决方案)

那么,如何在activity中加载view咧?我的着手点是既然只能加载一个布局文件,那么把view在xml文件里声明不就好了吗,所以,请你跟我这样做

  <com.example.icephone.MovingPicture
        android:id="@+id/view"
        android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            
            ></com.example.icephone.MovingPicture>
是的,如你所见,前面是你的继承于view类的文件路径,后面要定义一个id来使activity能找到他,那么,去运行一下吧~

如果无法运行成功,程序跳出,那么,请接着往下看

是的,你的view类里是不是这样写了?

public MovingPicture(Context context) {
		super(context);
}
那么,系统会提示你

Caused by: java.lang.NoSuchMethodException: HelloView(Context,AttributeSet)

没有这样的构造器?! 给他弄成这样的~

public MovingPicture(Context context,AttributeSet attrs) {
		super(context,attrs);
		// TODO Auto-generated constructor stub
		handler = new Handler();
		new Thread(this).start();
	}
这样就可以运行了

有人会问了:“为啥非要加载一个类,直接在xml中用view获得不就好了吗?”

这样的话,你的view就不自由,不可以按照你想的方法去动,如果创造了一个自定义的继承于view的类,你就可以使他实现runnable接口来让他动起来,下面介绍一个实现图片碰壁弹回的demo(此代码网上甚多,并无抄袭邀功之意,尊重原作者)

首先我们考虑一下需要什么变量?肯定要有个坐标吧?(经常写layout布局文件的同学们肯定能了解,在这里用距离左边和上边的距离来设置view(现在更喜欢叫他”精灵“))
然后,走肯定需要速度吧(一次移几个单位,用x,y来表示水平速度和竖直速度)最后,开启一个线程、获得图片等基础操作就不再详细介绍,直接上代码了

public class MovingPicture extends View implements Runnable{
	 int left = 0; 
	 int top = 0;
	 int dx = 1; 
	 int dy = 1;
	 Handler handler;
	Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.red1);

	public MovingPicture(Context context,attrs);
		// TODO Auto-generated constructor stub
		handler = new Handler();
		new Thread(this).start();
	}
好,到现在,我们已经完成了创建部分,但图没画出来,我们要开始画图啦
protected void onDraw(Canvas canvas) { 
		
	  canvas.drawBitmap(bitmap,left,top,null);
	  
	  
		}
其中,第一个元素是位图(这里注意:一定是位图而不是R.id.XXX,这样返回的值是一个int而不是bitmap<这是一个非常帅气的学长教我的>)Android开发的时候这种缺什么补什么的精神非常重要,我听过一句话“只要会英语的就可以自学Android...反正我不会英语 ”

废话少说,下面,我们要让图片动起来,而且当其坐标达到边界时,侦测到并且设置速度反向

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true)
		{
			dx = left < 0 || left > (getWidth() - bitmap.getWidth()) ? -dx : dx;
			dy = top < 0 || top > (getHeight() - bitmap.getHeight()) ? -dy : dy;
			left = left +dx;
			top = top + dy;
			
			handler.post(new Runnable() {  
				@Override
				public void run() { 
					invalidate();   
					}   
				});
			try{
				Thread.sleep(5);
			}catch(Exception e)
			{
				e.printStackTrace();
			}
休眠时间自己确定,也就是控制移动速度,这里仔细思考一下都能看明白吧,只有invalidate不太明白吧?他的作用是重绘view,欲知具体细节,请参考这篇博客:http://blog.csdn.net/qinjuning/article/details/7110211

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念