我们的机器人开发当中,移动端APP有一个控制的功能,实现当中,使用了一个类似于游戏手柄的界面,面对这样的界面首先肯定想到了使用"绘制"的方式搞定.那么就会使用到view或者surfaceview来实现了,而使用surfaceview能够在非UI线程上面进行,这必然是一大优势.先上图:
外部是一个背景图片,中间的渐变色圆圈是可以滑动"虚拟摇杆",控制区域是分为四个区域,如下图所示:
和第一个图相对比,其实就是要让虚拟摇杆在上图滑动的时候,在"A/B/C/D"四个区域内做方向的输出指令变化,由于下位机提供的指令只有前后左右四个指令,因此目前我认为只有这样实现比较方便和直观了,要实现这样一个绘制区域,那么肯定会使用到坐标和对应的直线方程知识了,在这里先暂时不具体说方程,先看看布局如何加载:
<com.~~.demoapplication.ControlView android:id="@+id/control_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center" />新建一个xml文件,然后添加这个布局在里面背景图片我们在代码里面添加:
public ControlView(Context context, AttributeSet attrs){ super(context, attrs); setBackgroundResource(R.drawable.hand_control_base); setZOrderOnTop(true);//使surfaceview放到最顶层 getHolder().setFormat(PixelFormat.TRANSLUCENT);//使窗口支持透明度 //初始化画笔 initPaint(); sfh = getHolder(); sfh.addCallback(this); th = new Thread(new DrawViewRunnable()); }在ControlView生命周期函数里面增加背景图片,然后设置为最顶层,并且透明显示,要不然只会出现一个黑框的surfaceView区域.然后初始化paint,得到holder和 callback.最后一句是开启绘制线程.
绘制线程我设置了200ms绘制更新一次界面:
class DrawViewRunnable implements Runnable { @Override public void run() { while(beginDrawing){ try{ myDraw(); Thread.sleep(200); }catch