学生描红详细文档.doc_第1页
学生描红详细文档.doc_第2页
学生描红详细文档.doc_第3页
学生描红详细文档.doc_第4页
学生描红详细文档.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Author 彭文忠简介 写这个文档是为了描述手写的实现。因为夏家莉老师要求描红上面有字,即根据有多少个字自动放到bitmap里面(如果字有很多的话,那么就要进行分成多页处理)。而且应该考虑到内存不足问题,因为bitmap比较大,组成的数组如果太大的话将因为内存不足而程序奔溃。解决办法是,测试内存可以放置多少张,当数组大小等于极限是提示不能超过。步骤 下面将实现手写的过程一步步实现,以现有描红实现为实例讲解I. 在dohomework_mh.xml中有下面一段代码,是用来实现后期需要用到的组件和为动态描红sufview预留空间所准备的。如下: PS:黄色部分是给动态的surfaceview预留的空间位置,具体如何加入在java代码中写,下面有提到。II.主要:写一个动态的surfaceview并在这里面进行鼠标监听和画线,以下是我为描红写的一个动态的surfaceview名称为:DrawingBoardSurfaceView.java,一下为代码部分:package com.rt.jxufe.ui.student.homework;import java.util.ArrayList;import com.rt.jxufe.R;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Picture;import android.graphics.Point;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.util.Log;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;/* * author 彭文忠 * 简介: 设计一个surfaceview类用来做手写输入的画板。 * */public class DrawingBoardSurfaceView extends SurfaceView implements Callback boolean flag = false; / 看看是否执行了Draw/ int i=1;/计算线程run的次数,检测为一次final static private String TAG = DrawingBoardSurfaceView;Canvas canvas;int startX, startY, endX, endY; / 绘制直线的变量SurfaceHolder mSurfaceHolder = null;/ bitmap是由资源索引取到的资源文件,你手写需要什么样的背景图就用什么资源/中图片的名字Bitmap bitmap = (BitmapDrawable) getResources().getDrawable(R.drawable.tzgbj6).getBitmap();/ bm是将bitmap图片通过复制得到的。区别在于:bm是可以用来画的(即可以做canvas(Bitmap)的参数),而只见诶的bitmap因为是一张图片不可以直接画画Bitmap bm = bitmap.copy(bitmap.getConfig(), true);/ 新建一个画布,背景是bm。注意bm此时已经在内存中了。只要对bm画画了都会改变bmCanvas canvasAwen,canvasClear;/ 建立一个画笔PaintPaint paint = new Paint();ArrayList poits = new ArrayList();/建立一个画笔专门用来做擦除用的Paint paintClear = new Paint();private float clearRadius=10; /设置擦除的范围为鼠标移动周围1格boolean clearFlag=false;/ 读取器public boolean isClearFlag() return clearFlag;public void setClearFlag(boolean clearFlag) this.clearFlag = clearFlag;public void setBm(Bitmap bm) this.bm = bm;public Bitmap getBitmap() return bitmap;public void setBitmap(Bitmap bitmap) this.bitmap = bitmap;/ 做一个get方法,方便手写图片的保存。public Bitmap getBm() return bm;public boolean isFlag() return flag;public void setFlag(boolean flag) this.flag = flag;public void setStartX(int startX) this.startX = startX;public void setStartY(int startY) this.startY = startY;public void setEndX(int endX) this.endX = endX;public void setEndY(int endY) this.endY = endY;public DrawingBoardSurfaceView(Context context) / TODO Auto-generated constructor stubsuper(context);mSurfaceHolder = this.getHolder();/ 回调方法mSurfaceHolder.addCallback(this);this.setFocusable(true);/* * run */ public void run() / / try / / catch (Exception e) / / e.printStackTrace();/ / / / synchronized (mSurfaceHolder) / / / /* * 大小改变时调用 */public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) /* * 创建时调用 */public void surfaceCreated(SurfaceHolder holder) / 画笔风格初始化paint.setStrokeWidth(3);paint.setStyle(Style.FILL);paint.setColor(Color.BLACK);canvas = holder.lockCanvas(); / 取得画布并锁定canvas.drawBitmap(bm, 0, 0, null); / 加载田字格背景效果holder.unlockCanvasAndPost(canvas); / 解锁并显示效果/ new Thread(this).start(); /一定要启动一个线程监控surface的所有活动/* * 销毁时调用 */public void surfaceDestroyed(SurfaceHolder holder) /* * 这个是一个自己写的根据坐标进行绘图的功能函数。这个函数不使用了。因为android刷新比较慢,用这个方法监控的鼠标得到的线是虚线。 * 所以下面的是将所有监控到的点坐标保存了起来最后画出来 */public void Draw(int startx, int starty, int endx, int endy) / 得到当前画布并锁定画布canvas = mSurfaceHolder.lockCanvas();if (mSurfaceHolder = null | canvas = null) return;/ 绘图Paint paint = new Paint();paint.setColor(Color.RED);canvas.drawLine(startx, starty, endx, endy, paint);/ 解除锁定画布mSurfaceHolder.unlockCanvasAndPost(canvas);/* * 重载Draw,实现对Arraylist进行画线 */public void Draw(ArrayList poits) / 对canvasAwen这个画布进行画画,这个步骤是在内存中做的。每次监控都做,然后将内存中已经改变了的bm作为一个整体放到我们当前显示的画布中去flag = true;canvasAwen = new Canvas(bm);if (poits.size() = 2) for (int i = 0; i poits.size() - 1; i+) canvasAwen.drawLine(int) poits.get(i).x, (int) poits.get(i).y,(int) poits.get(i + 1).x, (int) poits.get(i + 1).y,paint);/ 得到当前画布并锁定画布canvas = mSurfaceHolder.lockCanvas();if (mSurfaceHolder = null | canvas = null) return;canvas.drawBitmap(bm, 0, 0, null);/ 解除锁定画布mSurfaceHolder.unlockCanvasAndPost(canvas);/实现擦除功能:即在鼠标拖过的地方画颜色与底色相同的实心的圆形public void Clear(ArrayList poits)paintClear.setStrokeWidth(5);paintClear.setStyle(Style.FILL);paintClear.setColor(Color.WHITE);/直接从新以当前需要画的bm为画布,去进行擦除即可的。canvasClear = new Canvas(bm);for (int i = 0; i poits.size() - 1; i+) canvasClear.drawCircle(int) poits.get(i).x, (int) poits.get(i + 1).y, clearRadius, paintClear);/画布从内存中取出并显示canvas = mSurfaceHolder.lockCanvas();if (mSurfaceHolder = null | canvas = null) return;canvas.drawBitmap(bm, 0, 0, null);/ 解除锁定画布mSurfaceHolder.unlockCanvasAndPost(canvas);/ 这个函数是用来绘Bitmap的,应用:activity中进行调用public void DrawBitmap(Bitmap bitmap) / 得到当前画布并锁定画布canvas = mSurfaceHolder.lockCanvas();if (mSurfaceHolder = null | canvas = null) return;canvas.drawBitmap(bitmap, 0, 0, null);/ 解除锁定画布mSurfaceHolder.unlockCanvasAndPost(canvas);public boolean onTouchEvent(MotionEvent event) switch (event.getAction() case MotionEvent.ACTION_DOWN:/ 按下poits.clear();Point lineStart = new Point(int) event.getX(), (int) event.getY();poits.add(lineStart);break;case MotionEvent.ACTION_MOVE:/ 移动/ drawingBoardSurfaceView.Draw(lineStart.x, lineStart.y, (int)/ event.getX(), (int) event.getY()-offsetY);/ lineStart.set(int) event.getX(), (int) event.getY()-offsetY);Point lineEnd = new Point(int) event.getX(), (int) event.getY();poits.add(lineEnd);if(clearFlag=true)this.Clear(poits);elseDraw(poits);break;case MotionEvent.ACTION_UP:/ 按下 空break;return true; / 一定要return true,否则监听不到移动和按下III .可以写一个单独的Activity来控制这个surfaceview也可以在一个打的activity中直接调用这个surfaceview即可。我实现的时候由于描红只是做题的一个子模块,所以是放在做题这个整个activity中来调用的,即DoHomework_mh.java,代码如下:package com.rt.jxufe.ui.student.homework;/* * author 阿文 * 简介 在周建斌的Dohomework.java代码的基础上增加描红部分功能。尚没有成功运行所以别提交,明天来做 */import com.db4o.ObjectSet;import com.rt.jxufe.R;import com.rt.jxufe.data.javabean.Class;import com.rt.jxufe.data.javabean.Grade;import com.rt.jxufe.data.javabean.student.Student;import com.rt.jxufe.data.javabean.student.homework.HomeworkSubmit;import com.rt.jxufe.data.javabean.teacher.Teacher;import com.rt.jxufe.data.javabean.teacher.homework.Answer;import com.rt.jxufe.data.javabean.teacher.homework.HomeworkAssign;import com.rt.jxufe.data.javabean.teacher.homework.HomeworkRecord;import com.rt.jxufe.data.javabean.teacher.homework.HomeworkScore;import com.rt.jxufe.dataprovider.student.DbStuProvider;import com.rt.jxufe.library.tree.DoHomeworkTree;import com.rt.jxufe.library.tree.TreePoint;import android.app.ListActivity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;import android.graphics.Bitmap;import android.text.format.Time;import android.util.Log;public class DoHomework_mh extends ListActivity / 用于显示作业这一块private TextView info;/ 显示作业内容private TextView homeworkId, title;/ 显示作业标题以及作业题号EditText editText;HomeworkScore score;int count = 0;/ 表示计算ArrayList下标/以下部分是描红部分需要的变量以及实现过程static int pictureCount = 0; / 用来个图片命名的Toast toast;LinearLayout m_LinearLayout;final static String TAG = DoHomework_mh;Button btn_mhXiaye, btn_mhShangye, btn_mhFanhui, btn_mhSubmit, btn_NewPage,btn_mhRubber, btn_mhDelete;DrawingBoardSurfaceView m_DrawingBoardSurfaceView;/ 定于初始的bitmapFactory需要保存图片的Arraylist,以及它需要的容量大小ArrayList bitmapFactory;private static int bitmapCapacity = 100;private DbStuProvider bitmapStore;ObjectSet result;private boolean clearOrnot = false;public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.dohomework_mh);/* 显示树 */info = (TextView) findViewById(R.id.textView_homework);homeworkId = (TextView) findViewById(R.id.textView_zyth);title = (TextView) findViewById(R.id.textView_zybt);/ 调用学生数据库的构造函数,声明需要保存的对象是bitmap类型的bitmapStore = new DbStuProvider(ArrayList.class);bitmapFactory = new ArrayList();/ 初始化arraylist容量大小为100/这块需要注意下,就是如何将动态的surfaceview放到指定的xml对应的位置m_DrawingBoardSurfaceView = new DrawingBoardSurfaceView(this);m_LinearLayout = (LinearLayout) findViewById(R.id.LinearLayout_mhbj);LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);m_LinearLayout.addView(m_DrawingBoardSurfaceView, param);/ 返回按钮:实现返回到之前做题界面btn_mhFanhui = (Button) findViewById(R.id.button_mhfanhui);btn_mhFanhui.setOnClickListener(new OnClickListener() public void onClick(View v) / TODO Auto-generated method stubIntent intent = new Intent();intent.setClass(DoHomework_mh.this, DoHomework.class);startActivity(intent);pictureCount = 0;DoHomework_mh.this.finish(););/ 新页:保存前一页,并放置新页面btn_NewPage = (Button) findViewById(R.id.button_mhnewpage);btn_NewPage.setOnClickListener(new OnClickListener() public void onClick(View v) / 1.取到画好的bitmapBitmap bitmap = m_DrawingBoardSurfaceView.getBm();/ 如果前一页是最新新建的且画了东西的默认保存(如果是正在查看中的图片进行修改的话只需要替换而不需要在后面添加)/toast = Toast.makeText(DoHomework_mh.this, pictureCount=/+ pictureCount + bitmapFactory.size()=/+ bitmapFactory.size(), Toast.LENGTH_SHORT);/toast.show();if (m_DrawingBoardSurfaceView.isFlag() = true) / 有修改的才放进来/ /如果新建的当前页面是最新的而不是查看中的,即在pictureCount+后就等于bitmapFactory.size()了。此时加入到后面,否则其他的是进行了修改那么不在后面重新插入的。if (pictureCount = bitmapFactory.size() pictureCount+;bitmapFactory.add(bitmap);/ 2.设置新的纸张(画板)m_DrawingBoardSurfaceView.setBm(m_DrawingBoardSurfaceView.getBitmap().copy(bitmap.getConfig(), true);m_DrawingBoardSurfaceView.DrawBitmap(m_DrawingBoardSurfaceView.getBitmap();/ 重新将状态改到没画东西标志m_DrawingBoardSurfaceView.setFlag(false);/ btn_mhXiaye.setVisibility(1);/ /将图片保存到sdcard中的操作/ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)/ /判断是否可以对SDcard进行操作/ / Log.v(Dohomework_mh,得到DrawingBoardSurfaceView中的图片);/ pictureCount+;/ File sdCardDir =/ Environment.getExternalStorageDirectory();/获取SDCard目录/ File file = new/ File(sdCardDir,picture+Integer.toString(pictureCount)+.png);/在SDcard的目录下创建图片文件/ try /将网络上读取的图片保存到SDCard中/ / FileOutputStream out=new FileOutputStream(file);/为图片文件实例化输出流/ if(press(Bitmap.CompressFormat.PNG, 100,/ out)/对图片保存/ / out.flush();/ toast = Toast.makeText(DoHomework_mh.this,/ picture+pictureCount+图片+已保存, Toast.LENGTH_SHORT);/ toast.show();/ out.close();/ / / catch (FileNotFoundException e)/ / Log.v(TAG,文件没发现!);/ e.printStackTrace();/ catch (IOException e)/ / e.printStackTrace();/ Log.v(TAG,数据流错误!);/ / );/ 上一页:直接查看上一副图片(暂时不可以进行修改)。如果没错最后点击提交即可。btn_mhShangye = (Button) findViewById(R.id.button_mhshangye);btn_mhShangye.setOnClickListener(new OnClickListener() public void onClick(View v) if (pictureCount = bitmapFactory.size() - 1) toast = Toast.makeText(DoHomework_mh.this, 当前页已经是最后一页,Toast.LENGTH_SHORT);toast.show();if (pictureCount = bitmapFactory.size() - 1) pictureCount = bitmapFactory.size(); / 保持pictureCount与size相等,在新建页的时候才能添加进去啊 else pictureCount+; / 得到图片的序号,从而得到图片的全名,然后从数据库中取出后画到当前画布上即可/ 将数据库中取到的图片进行直接加工,修改后可以直接保存到数据库中m_DrawingBoardSurfaceView.setBm(bitmapFactory.get(pictureCount);m_DrawingBoardSurfaceView.DrawBitmap(bitmapFactory.get(pictureCount););/ 删除当前页按钮:实现在翻页查看时可以删除自己不满意的当前页面btn_mhDelete = (Button) findViewById(R.id.button_mhdelete);btn_mhDelete.setOnClickListener(new OnClickListener() public void onClick(View v) / 删除当前页bitmapFactory.remove(pictureCount);pictureCount-; / 删除当前页后总页数也需要减去1/ 删除后当前页消失,显示前一页了m_DrawingBoardSurfaceView.setBm(bitmapFactory.get(pictureCount);m_DrawingBoardSurfaceView.DrawBitmap(bitmapFactory.get(pictureCount););/ 保存按钮:时时监听ArrayList并保存到数据库中btn_mhSubmit = (Button) findViewById(R.id.button_mhsubmit);btn_mhSubmit.setOnClickListener(new OnClickListener() public void onClick(View v) / 在新一页写了东西,但是由于没有再次点击新一页那么当前也并没有保存到bitmapFactory中,此时如是直接点击保存应当将这一页保存到数据库中Bitmap bitmap = m_DrawingBoardSurfaceView.getBm();if (m_DrawingBoardSurfaceView.isFlag() = true) bitmapFactory.add(bitmap);bitmapStore.store(bitmapFactory);toast = Toast.makeText(DoHomework_mh.this, 保存成功:共有+ bitmapFactory.size() + 张图片保存到数据库!,Toast.LENGTH_SHORT);toast.show();/ 顺序执行:设置新的画布+标志此时画布状态没被画过+清空数组中之前画过的图片+清空图片计数器m_DrawingBoardSurfaceView.setBm(m_DrawingBoardSurfa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论