温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android游戏开发之View

发布时间:2020-07-30 19:42:24 阅读:669 作者:tdkgood 栏目:开发技术
Android开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等。

其实View的使用很简单--extends View即可,该重写重写。比较常用的有绘图函数onDraw();按键按下事件函数onKeyDown();按键抬起事件函数onKeyUp();触屏事件函数onTouchEvent()

OnDraw()的使用:

假使现在我们来画一个“Hello”文本,我们就可以用到上面的绘图函数onDraw(Canvas canvas)

既然要画东西那么我们首先得有只笔把,那就是Paint。画笔可以是各种颜色的,我们可以通过Paint.setColor()来挑个带颜色的笔。

现在我们已经有了一只带颜色的笔,要画东西的话还得有样必不可少的东西那就是画布--Canvas。因为Canvas对象是由绘图函数onDraw()直接传递进来的,那么我们现在只要canvas.drawText()就可以画文本了。

代码如下:

protected void onDraw(Canvas canvas)
{
//
创建画笔
Paint mPaint = new Paint() ;

//设置画笔颜色
mPaint.setColor(Color.BLUE) ;

//绘制文本
canvas.drawText("Hello", 200, 200, mPaint) ;
super.onDraw(canvas) ;

}

CanvasdrawText函数中有四个参数,第一个便是要显示的字符串,第二个和第三个是文本绘制在屏幕的具体位置即XY轴坐标。第四个便是我们的画笔Paint

关于XY轴坐标需要知道的是手机屏幕不管是横屏显示,还是竖屏显示,手机的最左上角永远是(00)坐标;而且手机屏幕的(00)坐标水平向右永远是X轴正方向,(00)坐标垂直向下永远是Y轴的正方向。

我们的View定义完毕之后如何应用这个ViewActivity上呢,还记得ActivityonCreate()函数下的setContentView()函数吗,只要实例化我们的View,并且作为参数传入就可以了。代码如下:
protected void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState) ;
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//
去除界面标题
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//
设置Activity界面充满屏幕
setContentView(new MyView(mContext)) ;
}

事件监听

按键监听事件:

按键按下事件函数onKeyDown()

按键抬起事件函数onKeyUp()

触屏监听事件:

触屏事件函数onTouchEvent()

触屏事件函数可以在用户手指按下时、手指离开屏幕时、手指在屏幕中滑动时触发。

假使我们想让刚才画的文本跟随手指进行滑动则可以在onTouchEvent()中获取到当前手指的坐标,然后传递到Canvas.drawText() 的坐标上,代码如下:

{

Log.d(log"onTouchEvent event.getAction:" + event.getAction()) ;

Log.d(log,"MotionEvent.ACTION_MOVE");

}elseif(event.getAction() == MotionEvent.ACTION_DOWN){

Log.d(log,"MotionEvent.ACTION_DOWN");

}elseif (event.getAction() == MotionEvent.ACTION_UP){

Log.d(log,"MotionEvent.ACTION_UP");

}

invalidate();

}

需要注意的是,invalidate()这个函数,通过此函数可以实现重新绘制画布,就相当于重新调用了onDraw()函数。因为onDraw()函数只有在View试图一开始创建的时候会执行一遍,所以在onTouchEvent()中重新绘制画布便可实现我们想要的效果了。

另外View类中除了invalidate()函数,还有一个名为postInvalidate()函数,它们的主要区别是:invalidate()不能在当前子线程中循环调用执行,即该函数只能在UI主线程中使用;而postInvalidate()便可以在子函数中循环执行。所以如果只在主线程中用这两个函数的话是都可以使用的。

大致View的使用就是这样,下面附件有个实现点击任意两个点使其连接成线的demo

publicclass MyView extends View

{

ArrayList < Float > lineX = new ArrayList < Float >() ;

ArrayList < Float > lineY = new ArrayList < Float >() ;

{

setFocusable(true) ;

}

{

Log.d(log"onKeyDown") ;

}

{

Log.d(log"onKeyUp") ;

}

{

Log.d(log"onTouchEvent event.getAction:" + event.getAction()) ;

float y = event.getY() ;

if(event.getAction() == MotionEvent.ACTION_MOVE){

Log.d(log,"MotionEvent.ACTION_MOVE");

textX = x;

textY = y;

}else if(event.getAction() == MotionEvent.ACTION_DOWN){

Log.d(log,"MotionEvent.ACTION_DOWN");

textX = x;

textY = y;

}else if (event.getAction() == MotionEvent.ACTION_UP){

Log.d(log,"MotionEvent.ACTION_UP");

textX = x;

textY = y;

}

invalidate();*/

{

Log.d(log"onTouchEvent ACTION_DOWN") ;

Log.d(log"onTouchEvent ACTION_UP") ;

Log.d(log"onTouchEvent ACTION_MULTIPLE") ;

};

invalidate();

}

绘图函数

* */

{

Log.d(log"onDraw") ;

{

}

{

}

{

{

{

Paint mPaint = new Paint() ;

mPaint.setColor(Color.BLUE) ;

canvas.drawLine(lineX.get(i), lineY.get(i), lineX.get(i + 1), lineY.get(i + 1), mPaint) ;

}

}

}

mPaint.setColor(Color.BLUE) ;

canvas.drawText("Hello", textX, textY, mPaint) ;

*/

}

}

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×