如何在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(现在更喜欢叫他”精灵“)) 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |