新建一个类。举例为MySurfaceView

packagecom.example.blt;importandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics.PixelFormat;importandroid.graphics.PorterDuff.Mode;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.view.SurfaceHolder;importandroid.view.SurfaceView;importandroid.view.SurfaceHolder.Callback;publicclassMySurfaceViewextendsSurfaceViewimplementsCallback{privateSurfaceHoldersfh;privateCanvascanvas;privatePaintpaint;privateintcoordinate;//固定摇杆背景圆形的半径privateintRockerCircleR,SmallRockerCircleR;//摇杆的X,Y坐标以及摇杆的半径privatefloatSmallRockerCircleX,SmallRockerCircleY;privateRudderListenerlistener=null;//事件回调接口publicMySurfaceView(Contextcontext){super(context);}publicMySurfaceView(Contextcontext,AttributeSetas){super(context,as);this.setKeepScreenOn(true);sfh=getHolder();sfh.addCallback(this);paint=newPaint();paint.setColor(Color.GREEN);paint.setAntiAlias(true);//抗锯齿setFocusable(true);setFocusableInTouchMode(true);setZOrderOnTop(true);sfh.setFormat(PixelFormat.TRANSPARENT);//设置背景透明}publicvoidsurfaceCreated(SurfaceHolderholder){//获得控件最小值intlittle=this.getWidth()<this.getHeight()?this.getWidth():this.getHeight();//根据屏幕大小绘制SmallRockerCircleX=SmallRockerCircleY=coordinate=little/2;//固定摇杆背景圆形的半径RockerCircleR=(int)(little*0.35);//摇杆的半径SmallRockerCircleR=(int)(little*0.15);draw();}/****得到两点之间的弧度*/publicdoublegetRad(floatpx1,floatpy1,floatpx2,floatpy2){//得到两点X的距离floatx=px2-px1;//得到两点Y的距离floaty=py1-py2;//算出斜边长floatxie=(float)Math.sqrt(Math.pow(x,2)+Math.pow(y,2));//得到这个角度的余弦值(通过三角函数中的定理:邻边/斜边=角度余弦值)floatcosAngle=x/xie;//通过反余弦定理获取到其角度的弧度floatrad=(float)Math.acos(cosAngle);//注意:当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180if(py2<py1){rad=-rad;}returnrad;}@SuppressLint("ClickableViewAccessibility")@OverridepublicbooleanonTouchEvent(MotionEventevent){if(event.getAction()==MotionEvent.ACTION_DOWN||event.getAction()==MotionEvent.ACTION_MOVE){//当触屏区域不在活动范围内if(Math.sqrt(Math.pow((coordinate-(int)event.getX()),2)+Math.pow((coordinate-(int)event.getY()),2))>=RockerCircleR){//得到摇杆与触屏点所形成的角度doubletempRad=getRad(coordinate,coordinate,event.getX(),event.getY());//保证内部小圆运动的长度限制getXY(coordinate,coordinate,RockerCircleR,tempRad);}else{//如果小球中心点小于活动区域则随着用户触屏点移动即可SmallRockerCircleX=(int)event.getX();SmallRockerCircleY=(int)event.getY();}}elseif(event.getAction()==MotionEvent.ACTION_UP){//当释放按键时摇杆要恢复摇杆的位置为初始位置SmallRockerCircleX=coordinate;SmallRockerCircleY=coordinate;}draw();if(listener!=null){listener.onSteeringWheelChanged((SmallRockerCircleX-coordinate)/RockerCircleR,(coordinate-SmallRockerCircleY)/RockerCircleR);}returntrue;}/****@paramR*圆周运动的旋转点*@paramcenterX*旋转点X*@paramcenterY*旋转点Y*@paramrad*旋转的弧度*/publicvoidgetXY(floatcenterX,floatcenterY,floatR,doublerad){//获取圆周运动的X坐标SmallRockerCircleX=(float)(R*Math.cos(rad))+centerX;//获取圆周运动的Y坐标SmallRockerCircleY=(float)(R*Math.sin(rad))+centerY;}publicvoiddraw(){try{canvas=sfh.lockCanvas();//canvas.drawColor(Color.WHITE);canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);//清除屏幕//设置透明度paint.setColor(Color.CYAN);//绘制摇杆背景canvas.drawCircle(coordinate,coordinate,RockerCircleR,paint);paint.setColor(Color.RED);//绘制摇杆canvas.drawCircle(SmallRockerCircleX,SmallRockerCircleY,SmallRockerCircleR,paint);}catch(Exceptione){//TODO:handleexception}finally{try{if(canvas!=null)sfh.unlockCanvasAndPost(canvas);}catch(Exceptione2){}}}publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){}publicvoidsurfaceDestroyed(SurfaceHolderholder){}//设置回调接口publicvoidsetRudderListener(RudderListenerrockerListener){listener=rockerListener;}//回调接口publicinterfaceRudderListener{voidonSteeringWheelChanged(floatcross,floatlongitudinal);}}


主窗体中

packagecom.example.blt;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassControlActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_control);MySurfaceViewtemp=(MySurfaceView)findViewById(R.id.rudder);temp.setRudderListener(newMySurfaceView.RudderListener(){@OverridepublicvoidonSteeringWheelChanged(floatcross,floatlongitudinal){//TODOAuto-generatedmethodstubLog.v("change","c"+cross+"l"+longitudinal);((TextView)findViewById(R.id.textView2)).setText("c:"+cross+"l:"+longitudinal);}});((Button)findViewById(R.id.button2)).setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstub}});}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.//getMenuInflater().inflate(R.menu.control,menu);returnfalse;}@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//Handleactionbaritemclickshere.Theactionbarwill//automaticallyhandleclicksontheHome/Upbutton,solong//asyouspecifyaparentactivityinAndroidManifest.xml.intid=item.getItemId();if(id==R.id.action_settings){returntrue;}returnsuper.onOptionsItemSelected(item);}}

----------------------主窗体XML

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"><GridLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:columnCount="3"><com.example.blt.MySurfaceViewandroid:id="@+id/rudder"android:layout_width="150dp"android:layout_height="150dp"android:layout_column="0"android:layout_gravity="left|bottom"/><TextViewandroid:id="@+id/textView2"android:layout_column="1"android:layout_gravity="left|top"android:text="TextView"/><TableLayoutandroid:layout_column="2"android:layout_gravity="bottom"android:layout_row="0"><TableRowandroid:id="@+id/tableRow1"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/axis_x"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView"/></TableRow><TableRowandroid:id="@+id/tableRow2"android:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="自动"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"/></TableRow><TableRowandroid:id="@+id/tableRow3"android:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"/><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"/></TableRow><TableRowandroid:id="@+id/tableRow4"android:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"/><Buttonandroid:id="@+id/button6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"/></TableRow></TableLayout></GridLayout></RelativeLayout>

------------------------------应用到自定义控件

更多相关文章

  1. Android(安卓)自定义View之能力分析图
  2. Android(安卓)GPS 获得 经纬度 并得到该 坐标 精确地址
  3. Android(安卓)NetworkLocationProvider and GeocodeProvider
  4. Android(安卓)百度地图 对鼠标点击、移动、抬起三个事件的监听
  5. android view相对于根布局的坐标获取
  6. android Draw Rect 坐标图示
  7. Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
  8. Android移动view动画问题
  9. OpenGL ES 纹理过滤模式-glTexParameteri

随机推荐

  1. Android - java.lang.ClassCastException
  2. Android Base64编码
  3. Android Studio 没有Generate signed Bun
  4. android悬浮球,应用在所有软件之上,点击可
  5. android RecyclerView 设置设置选中的一
  6. Android(安卓)Ui设计相关的网站推荐
  7. Android腾讯微薄客户端开发十一:博主的粉
  8. Cocos2dxActivity cannot be resolved to
  9. Android(安卓)Studio中Git的配置及协同开
  10. Android 数据存储与读取:文件