Android开发:简单涂鸦板的实例

移动开发 Android
在Android上开发一些小应用既可以积累知识又可以增加乐趣,与任务式开发不同,所以想到在Android系统上实现一个简单的涂鸦板,这是我们练手的一种好的方法。

涂鸦板应用的代码实现

新建工程MyWall,修改/res/layout/main.xml文件,在里面添加一个SurfaceView和两个Button,用到了RelativeLayout布局,完整的main.xml文件如下:

 
  1. <?xmlversion="1.0"encoding="utf-8"?>  
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"  
  3. android:layout_width="fill_parent"  
  4. android:layout_height="fill_parent"  
  5. android:orientation="vertical"  
  6. >  
  7. <SurfaceView  
  8. android:id="@+id/surfaceview"  
  9. android:layout_width="fill_parent"  
  10. android:layout_height="wrap_content"  
  11. android:layout_above="@+id/line"  
  12. android:layout_alignParentTop="true"  
  13. />  
  14. <LinearLayout  
  15. android:id="@+id/line"  
  16. android:layout_width="fill_parent"  
  17. android:layout_height="wrap_content"  
  18. android:layout_alignParentBottom="true"  
  19. >  
  20. <Button  
  21. android:id="@+id/flushbutton"  
  22. android:layout_width="fill_parent"  
  23. android:layout_height="wrap_content"  
  24. android:layout_weight="1"  
  25. android:text="清屏"  
  26. />  
  27. <Button  
  28. android:id="@+id/colorbutton"  
  29. android:layout_width="fill_parent"  
  30. android:layout_height="wrap_content"  
  31. android:layout_weight="1"  
  32. android:text="颜色"  
  33. />  
  34. </LinearLayout>  
  35. </RelativeLayout>  

接着,修改MyWallActivity.java文件,最主要是重写了onTouchEvent()函数,在这个函数里过滤出触屏拖动事件,然后获取其相应的坐标和画线。完整的内容如下:

  1. package com.nan.wall;       
  2. import android.app.Activity;       
  3. import android.app.AlertDialog;       
  4. import android.app.Dialog;       
  5. import android.content.DialogInterface;       
  6. import android.graphics.Canvas;       
  7. import android.graphics.Color;       
  8. import android.graphics.Paint;       
  9. import android.graphics.Rect;       
  10. import android.os.Bundle;       
  11. import android.view.MotionEvent;       
  12. import android.view.SurfaceHolder;        
  13. import android.view.SurfaceView;       
  14. import android.view.View;        
  15. import android.widget.Button;        
  16. publicclass MyWallActivity extends Activity         
  17. {       
  18. private SurfaceView mSurfaceView = null;        
  19. private SurfaceHolder mSurfaceHolder = null;        
  20. private Button cleanButton = null;        
  21. private Button colorButton = null;        
  22. privatefloat oldX = 0f;        
  23. privatefloat oldY = 0f;        
  24. privateboolean canDraw = false;       
  25. private Paint mPaint = null;       
  26. //用来记录当前是哪一种颜色      
  27. privateint whichColor = 0;        
  28. /** Called when the activity is first created. */ 
  29. @Override 
  30. publicvoid onCreate(Bundle savedInstanceState)         
  31. {        
  32. super.onCreate(savedInstanceState);       
  33. setContentView(R.layout.main);       
  34. mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview);       
  35. mSurfaceHolder = mSurfaceView.getHolder();       
  36. mPaint = new Paint();        
  37. //画笔的颜色      
  38. mPaint.setColor(Color.RED);        
  39. //画笔的粗细      
  40. mPaint.setStrokeWidth(2.0f);       
  41. cleanButton = (Button)this.findViewById(R.id.flushbutton);        
  42. //按钮监听      
  43. cleanButton.setOnClickListener(new View.OnClickListener()         
  44. {        
  45. @Override 
  46. publicvoid onClick(View v)         
  47. {        
  48. // TODO Auto-generated method stub      
  49. //锁定整个SurfaceView      
  50. Canvas mCanvas = mSurfaceHolder.lockCanvas();        
  51. mCanvas.drawColor(Color.BLACK);        
  52. //绘制完成,提交修改     
  53. mSurfaceHolder.unlockCanvasAndPost(mCanvas);        
  54. //重新锁一次      
  55. mSurfaceHolder.lockCanvas(new Rect(0000));        
  56. mSurfaceHolder.unlockCanvasAndPost(mCanvas);        
  57. }       
  58. });           
  59. colorButton = (Button)this.findViewById(R.id.colorbutton);       
  60. //按钮监听      
  61. colorButton.setOnClickListener(new View.OnClickListener()         
  62. {        
  63. @Override 
  64. publicvoid onClick(View v)        
  65. {        
  66. // TODO Auto-generated method stub     
  67. Dialog mDialog = new AlertDialog.Builder(MyWallActivity.this)        
  68. .setTitle("颜色设置")        
  69. .setSingleChoiceItems(new String[]{"红色","绿色","蓝色"}, whichColor, new DialogInterface.OnClickListener()         
  70. {        
  71. @Override 
  72. publicvoid onClick(DialogInterface dialog, int which)         
  73. {        
  74. // TODO Auto-generated method stub      
  75. switch(which)        
  76. {        
  77. case0:        
  78. {        
  79. //画笔的颜色      
  80. mPaint.setColor(Color.RED);        
  81. whichColor = 0;        
  82. break;        
  83. }        
  84. case1:        
  85. {        
  86. //画笔的颜色     
  87. mPaint.setColor(Color.GREEN);       
  88. whichColor = 1;       
  89. break;       
  90. }       
  91. case2:       
  92. {       
  93. //画笔的颜色106                                  
  94. mPaint.setColor(Color.BLUE); 
  95. whichColor = 2;                                  
  96. break;                                   
  97. }       
  98. }       
  99. }       
  100. })       
  101. .setPositiveButton("确定"new DialogInterface.OnClickListener()       
  102. {       
  103. @Override 
  104. publicvoid onClick(DialogInterface dialog, int which)        
  105. {       
  106. // TODO Auto-generated method stub     
  107. dialog.dismiss();       
  108. }       
  109. })       
  110. .create();       
  111. mDialog.show();       
  112. }       
  113. });       
  114. @Override 
  115. publicboolean onTouchEvent(MotionEvent event)       
  116. {             
  117. //获取x坐标     
  118. float x = event.getX();       
  119. //获取y坐标(不知道为什么要减去一个偏移值才对得准屏幕)     
  120. float y = event.getY()-50;       
  121. //第一次进来先不管     
  122. if(canDraw)       
  123. {            
  124. //获取触屏事件     
  125. switch(event.getAction())       
  126. {       
  127. //如果是拖动事件     
  128. case MotionEvent.ACTION_MOVE:       
  129. {       
  130. //锁定整个SurfaceView     
  131. Canvas mCanvas = mSurfaceHolder.lockCanvas();           
  132. mCanvas.drawLine(x, y, oldX, oldY, mPaint);       
  133. mSurfaceHolder.unlockCanvasAndPost(mCanvas);       
  134. //重新锁一次     
  135. mSurfaceHolder.lockCanvas(new Rect(0000));       
  136. mSurfaceHolder.unlockCanvasAndPost(mCanvas);       
  137. break;       
  138. }       
  139. }       
  140. }       
  141. //保存目前的x坐标值     
  142. oldX = x;       
  143. //保存目前的y坐标值     
  144. oldY = y;       
  145. canDraw = true;       
  146. returntrue;       
  147. }       
  148. }      
 

应用测试

在模拟器上运行此应用是如下效果:

在Android手机上运行效果则是这样的:

字写的有点丑,但是功能实现了。在获取了Y坐标后减去一个偏移值50,这个值是猜出来的,没想到在模拟器和真机上定位得都还蛮准的。

应用比较简易,但是大家可以在此基础上丰富它的功能,使其成为一个像样的Android应用。

责任编辑:闫佳明 来源: jizhuomi
相关推荐

2012-04-20 11:07:12

Titanium

2011-09-09 16:00:02

Android Web实例

2013-05-20 15:42:22

2014-06-19 10:43:37

AndroidScrollerView平滑滚动

2011-09-08 13:41:53

Widget

2011-09-07 17:54:40

Android Wid开发

2013-02-20 15:29:00

JSONAndroid开发

2011-09-08 13:11:07

Android Wid实例

2009-04-02 15:58:12

AndroidEclipseSqlite

2014-08-26 11:46:46

QtAndroid实例教程

2011-04-12 08:40:23

IMFAndroid

2011-04-11 09:46:28

Android 3.1Ice CreamAndroid

2015-02-06 18:16:03

涂鸦

2015-01-26 13:30:13

批注涂鸦

2009-09-24 10:06:42

Hibernate实例

2022-04-01 15:54:01

DHCP网络协议开发板

2013-05-20 17:51:47

Android游戏开发SurfaceView

2013-05-23 15:06:22

Android开发体重计算器移动应用

2017-02-24 12:29:20

Android Thi开发板硬件

2013-04-19 10:38:30

点赞
收藏

51CTO技术栈公众号