是一个关于在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 原文链接:https://www.f2er.com/xml/296947.html