Android应用开发实例篇(1)-----简易涂鸦板
一、概述
这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想到要把它在Android上实现,呵呵,既简单又有趣。
二、实现
新建工程MyWall,修改/res/layout/main.xml文件,在里面添加一个SurfaceView和两个Button,用到了RelativeLayout布局,完整的main.xml文件如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 android:orientation="vertical" 7 > 8 9 <SurfaceView 10 android:id="@+id/surfaceview"11 android:layout_width="fill_parent"12 android:layout_height="wrap_content"13 android:layout_above="@+id/line"14 android:layout_alignParentTop="true"15 />16 17 <LinearLayout 18 android:id="@+id/line"19 android:layout_width="fill_parent"20 android:layout_height="wrap_content"21 android:layout_alignParentBottom="true"22 >23 24 <Button 25 android:id="@+id/flushbutton"26 android:layout_width="fill_parent"27 android:layout_height="wrap_content" 28 android:layout_weight="1"29 android:text="清屏"30 />31 32 <Button 33 android:id="@+id/colorbutton"34 android:layout_width="fill_parent"35 android:layout_height="wrap_content"36 android:layout_weight="1" 37 android:text="颜色"38 />39 </LinearLayout>40 </RelativeLayout>
接着,修改MyWallActivity.java文件,最主要是覆写了onTouchEvent()函数,在这个函数里过滤出触屏拖动事件,然后获取其相应的坐标和画线,关于SurfaceView的用法在基础篇里有讲到。完整的内容如下:
1 package com.nan.wall; 2 3 import android.app.Activity; 4 import android.app.AlertDialog; 5 import android.app.Dialog; 6 import android.content.DialogInterface; 7 import android.graphics.Canvas; 8 import android.graphics.Color; 9 import android.graphics.Paint; 10 import android.graphics.Rect; 11 import android.os.Bundle; 12 import android.view.MotionEvent; 13 import android.view.SurfaceHolder; 14 import android.view.SurfaceView; 15 import android.view.View; 16 import android.widget.Button; 17 18 public class MyWallActivity extends Activity 19 { 20 private SurfaceView mSurfaceView = null; 21 private SurfaceHolder mSurfaceHolder = null; 22 private Button cleanButton = null; 23 private Button colorButton = null; 24 25 private float oldX = 0f; 26 private float oldY = 0f; 27 28 private boolean canDraw = false; 29 private Paint mPaint = null; 30 //用来记录当前是哪一种颜色 31 private int whichColor = 0; 32 33 /** Called when the activity is first created. */ 34 @Override 35 public void onCreate(Bundle savedInstanceState) 36 { 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.main); 39 40 mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview); 41 mSurfaceHolder = mSurfaceView.getHolder(); 42 43 mPaint = new Paint(); 44 //画笔的颜色 45 mPaint.setColor(Color.RED); 46 //画笔的粗细 47 mPaint.setStrokeWidth(2.0f); 48 49 cleanButton = (Button)this.findViewById(R.id.flushbutton); 50 //按钮监听 51 cleanButton.setOnClickListener(new View.OnClickListener() 52 { 53 54 @Override 55 public void onClick(View v) 56 { 57 // TODO Auto-generated method stub 58 //锁定整个SurfaceView 59 Canvas mCanvas = mSurfaceHolder.lockCanvas(); 60 mCanvas.drawColor(Color.BLACK); 61 //绘制完成,提交修改 62 mSurfaceHolder.unlockCanvasAndPost(mCanvas); 63 //重新锁一次 64 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); 65 mSurfaceHolder.unlockCanvasAndPost(mCanvas); 66 } 67 }); 68 69 colorButton = (Button)this.findViewById(R.id.colorbutton); 70 //按钮监听 71 colorButton.setOnClickListener(new View.OnClickListener() 72 { 73 74 @Override 75 public void onClick(View v) 76 { 77 // TODO Auto-generated method stub 78 Dialog mDialog = new AlertDialog.Builder(MyWallActivity.this) 79 .setTitle("颜色设置") 80 .setSingleChoiceItems(new String[]{"红色","绿色","蓝色"}, whichColor, new DialogInterface.OnClickListener() 81 { 82 83 @Override 84 public void onClick(DialogInterface dialog, int which) 85 { 86 // TODO Auto-generated method stub 87 switch(which) 88 { 89 case 0: 90 { 91 //画笔的颜色 92 mPaint.setColor(Color.RED); 93 whichColor = 0; 94 break; 95 } 96 case 1: 97 { 98 //画笔的颜色 99 mPaint.setColor(Color.GREEN);100 whichColor = 1;101 break;102 }103 case 2:104 {105 //画笔的颜色106 mPaint.setColor(Color.BLUE);107 whichColor = 2;108 break;109 }110 }111 }112 })113 .setPositiveButton("确定", new DialogInterface.OnClickListener() 114 {115 116 @Override117 public void onClick(DialogInterface dialog, int which) 118 {119 // TODO Auto-generated method stub120 dialog.dismiss();121 }122 })123 .create();124 mDialog.show();125 }126 });127 128 }129 130 131 @Override132 public boolean onTouchEvent(MotionEvent event)133 { 134 //获取x坐标135 float x = event.getX();136 //获取y坐标(不知道为什么要减去一个偏移值才对得准屏幕)137 float y = event.getY()-50;138 139 //第一次进来先不管140 if(canDraw)141 { 142 //获取触屏事件143 switch(event.getAction())144 {145 //如果是拖动事件146 case MotionEvent.ACTION_MOVE:147 {148 149 //锁定整个SurfaceView150 Canvas mCanvas = mSurfaceHolder.lockCanvas(); 151 mCanvas.drawLine(x, y, oldX, oldY, mPaint);152 mSurfaceHolder.unlockCanvasAndPost(mCanvas);153 //重新锁一次154 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));155 mSurfaceHolder.unlockCanvasAndPost(mCanvas);156 break;157 }158 }159 160 }161 //保存目前的x坐标值162 oldX = x;163 //保存目前的y坐标值164 oldY = y;165 166 canDraw = true;167 168 return true;169 }170 171 }
好了,在模拟器上运行效果如下:
在真机上运行效果如下:
呵呵,写得比较丑。
在获取了Y坐标后减去一个偏移值50,这个值是我直接猜出来的,没想到在模拟器和真机上定位得还蛮准的,哈哈。当然这个应用的功能不多,不过有兴趣的话可以再完善它,希望能起到抛砖引玉的作用。
转载于:https://www.cnblogs.com/zhwl/archive/2012/03/16/2400493.html
Android应用开发实例篇(1)-----简易涂鸦板相关推荐
- Android NFC开发-理论篇
Android NFC开发-理论篇 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CSDN_GYG/article/details/72884849 ...
- HTML5实例教程——简易涂鸦板-何韬-专题视频课程
HTML5实例教程--简易涂鸦板-6858人已学习 课程介绍 用CANVES制作一个涂鸦板,让初学者初步了解HTML5的语言与功能. 课程收益 快速学会涂鸦板的做法,同时对HT ...
- OpenCV android sdk配置OpenCV android NDK开发实例
OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...
- android 串口开发第二篇:利用jni实现android和串口通信
一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...
- 开发android 输入法,Android输入法开发实例解析 Android开发技术
Android输入法开发实例解析 Android开发技术 2013 年 4 月 13 日 这里我们建立表1为BiHua,同时构建两个字段,字段1为"input"来存放输入的,字段2 ...
- Android App开发基础篇—数据存储(SQLite数据库)
Android App开发基础篇-数据存储(SQLite数据库) 前言:Android中提供了对SQLite数据库的支持.开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作. 一. ...
- [网络电话]Android Linphone开发实例
[网络电话]Android Linphone开发实例 Linphone是一个网络电话或者IP语音电话(VoIP),是一款遵循GPL的开源的网络视频电话系统,其主要如下: 使用Linphone,我们可以 ...
- [网络电话]Android CSipSimple开发实例
[网络电话]Android CSipSimple开发实例 CSipSimple 是一款通用的支持SIP协议的互联网电话软件,可以在andriod的平板,手机上使用.支持语音编码: G.711 aLaw ...
- android 简易涂鸦板,canvas实现的简易涂鸦板效果
用canvas实现的简易涂鸦板效果,用鼠标点击在画布上随意涂鸦 涂鸦 *{ margin: 0; padding: 0; } #canvas1{ box-shadow: 0 5px 40px blac ...
最新文章
- 600页!分享珍藏很久的《推荐系统学习手册》(附下载链接及入门经验)
- 傅里叶分析中的时频域之间的关系(以及一点对于DFT的一点思考)
- 纯CSS实现文字一行居中,多行左对齐的方法
- Web开发中的相对路径和绝对路径
- Hadoop自带WordCount.java程序
- 计算机体系结构:嵌入式方法_计算机考研——计算机二级学科详解
- Vue实现仿音乐播放器8-实现热门榜单效果
- 算法4------字符串的字典序最长子序列
- eclipse插件大全整理学习
- 论文浅尝 | Complex Embeddings for Simple Link Prediction
- Android P (1)---开发指南
- html post与get的区别,post 和get请求的区别(html)
- Input Output
- Hibernate4 buildSessionFactory过时解决方案(Annotation也是一样解决)
- EtherCAT主站SOEM函数详解---- ecx_statecheck
- IPC进程间通信/跨进程通信
- 中科视拓上榜2019人脸识别技术公司排行TOP 10
- Word 分节设置不同起始页码
- 中高级Android面试中你不得不会的知识点,3面直接拿到offer
- Provision not found. A provision is required for deploying your app to the device. 解决方案
热门文章
- Python中groupby的简单使用
- leetcode —— 877. 石子游戏
- 『BDD100K的labels文件json转YOLOV5要求的txt文件』【包括识别交通灯】(代码编写)
- Linux环境下使用NLPIR(ICTCLAS)中文分词详解
- Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用
- 利用ffmpeg进行摄像头提取视频编码为h264通过RTP发送数据到指定的rtp地址
- html5 lang en 乱码,CSS中的html [lang =“en”]和html:lang(en)有什么区别?
- 棋盘覆盖-分治法(代码实现)
- 【编撰】linux IPC 001 - 概述
- 简单且有创意的python作品_适合练手的 14 个Python 小项目,趣味十足!