Andoid实现手动绘图
public class MainActivity extends Activity
{
int width,height;
private GameView gameview;
private Canvas canvas;
private Bitmap map;
private Paint paint;
public Path path;
private int color,pen;
private boolean isclear=true;
@SuppressWarnings("deprecation")
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //获得手机屏幕的宽度和高度
width=getWindowManager().getDefaultDisplay().getWidth();
height=getWindowManager().getDefaultDisplay().getHeight(); //设置手机为全屏模式
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); gameview=new GameView(this, width, height); setContentView(gameview);
canvas=gameview.canvas;
map=gameview.map;
paint=gameview.paint;
path=gameview.dpath;
color=gameview.color;
} //创建菜单
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
} //添加菜单事件监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.save:
try
{
Random random=new Random();
int a=random.nextInt(100);//产生100以内的数据
File f=new File(Environment.getExternalStorageDirectory().getPath()+"/bitmap");
f.mkdir();
File file=new File(f,a+".jpg");
FileOutputStream outstream=new FileOutputStream(file); map.compress(Bitmap.CompressFormat.PNG, 90, outstream);
//把bitmap对象保存一张jpg的图片 Toast.makeText(this, "保存成功!", Toast.LENGTH_LONG).show();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
break;
case R.id.Color:
if(path!=null)
{
canvas.drawPath(path, paint);
gameview.invalidate();
}
Builder dialog=new AlertDialog.Builder(this);
dialog.setSingleChoiceItems(new String[]{"红色","绿色","黄色","粉色"}, 0, new OnClickListener()
{
public void onClick(DialogInterface arg0, int arg1) {
switch (arg1)
{
case 0:
paint.setColor(Color.RED);
break;
case 1:
paint.setColor(Color.GREEN);
break;
case 2:
paint.setColor(Color.YELLOW);
break;
case 3:
paint.setColor(Color.MAGENTA);
break;
}
pen=paint.getColor();
}
});
dialog.setPositiveButton("确定", null).create();
dialog.show();
gameview.invalidate();
break;
case R.id.Paintsize:
paint.setStrokeWidth(5);
gameview.invalidate();
break;
case R.id.background:
canvas.drawColor(Color.DKGRAY);
color=Color.CYAN;
gameview.invalidate();
break;
case R.id.clear:
path=new Path();
gameview.invalidate();
break;
}
return super.onOptionsItemSelected(item);
} } 2.绘图操作的GameView类 public class GameView extends View implements OnTouchListener {
private float mx,my;//用来存手指移动后的坐标
public Bitmap map;//对图像的一些操作
public Canvas canvas;
public Path dpath;//主要用来绘制图像的对象,他会把所有绘制的图像保存到path里面
public Paint paint;//画笔
public int color;
public GameView(Context context,int width,int height) {
super(context);
map=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_4444);//绘制一个与手机屏幕大小的BitMap对象
canvas=new Canvas(map);
paint=new Paint();
paint.setAntiAlias(true);//消除锯齿
paint.setStyle(Style.STROKE);//设置画笔结尾时的样式为圆润
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.SQUARE);
paint.setColor(Color.MAGENTA);
paint.setStrokeWidth(3); this.setOnTouchListener(this);//添加触屏操作
} public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawColor(Color.WHITE);//这里具有清屏的意思
color=Color.DKGRAY;
canvas.drawBitmap(map, 0,0, paint);//从 0 0开始到map中的width,height的一块画布,也就是全屏幕的一块画布 //保存上次绘制的路径,只要他不为空就绘制出上次绘制的图形
if(dpath!=null)
{
canvas.drawPath(dpath, paint);
}
} public void touch_start(float x,float y)
{
dpath.moveTo(x, y);//设置绘制图形的起始点
}
public void touch_move(float x,float y)
{
// 从x1,y1到x2,y2画一条贝塞尔曲线,更平滑(直接用mPath.lineTo也是可以的)
dpath.lineTo(x,y);
mx = x;//把手指移动后的坐标存放到mx,my中,
my = y;
}
public void touch_up()
{
dpath.lineTo(mx, my);//设置手指从按下到移动过后之间绘制一条线存放到path中,之后通过下面的方法绘制到屏幕上
canvas.drawPath(dpath, paint);
}
public boolean onTouch(View arg0, MotionEvent event)
{
float x = event.getX()获得手指放下的坐标
float y = event.getY();
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
// 每次down下去重新new一个Path,这是一个要注意的地方,每一次手指从触摸屏幕到离开屏幕,都是一次新的path路径,所以要重新绘制一个新的Path对象
dpath = new Path();
touch_start(x, y);//设置起始点
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
//invalidate();
break;
}
return true;
} }
Andoid实现手动绘图的更多相关文章
- winform的扩展的带有截图功能picturebox
using System; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using Sys ...
- css切背景图片(background-position)
给元素添加背景图片的方式有很多,个人总结的有: 用img插入图片: css3的方式手动绘图: 单独用background-image单独插入图片: 其中用background-image有两种方法,一 ...
- 【深度学习系列】PaddlePaddle可视化之VisualDL
上篇文章我们讲了如何对模型进行可视化,用的keras手动绘图输出CNN训练的中途结果,本篇文章将讲述如何用PaddlePaddle新开源的VisualDL来进行可视化.在讲VisualDL之前,我们先 ...
- AT2165 Median Pyramid Hard
题目链接:戳我 一看范围1e5,往二分上想. 可是再怎么也没有想到这个神仙的二分答案qwq 我们二分一个数x,设比他大的数为1,小于等于他的数为0.那么我们就可以把原来的那个转化成一个01塔. 然后我 ...
- matplotlib 可视化 —— 移动坐标轴(中心位置)
通常软件绘图,包括 matlab.python 的 matplotlib,默认都是将坐标轴置于画布(figure)的最下侧(x 轴),最左侧(y 轴),也即将坐标原点置于左下角.而我们自己理解数学,以 ...
- DNN的BP算法Python简单实现
BP算法是神经网络的基础,也是最重要的部分.由于误差反向传播的过程中,可能会出现梯度消失或者爆炸,所以需要调整损失函数.在LSTM中,通过sigmoid来实现三个门来解决记忆问题,用tensorflo ...
- 浅谈 UNIX、Linux、ios、android 他们之间的关系
开源Linux 一个执着于技术的公众号 Unix, 简化形成了Linux,Linux则是Android的内核,而苹果则是使用unix系统作为ios和macos的内核. 几个系统出现的时间 UNIX系统 ...
- VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...
- 第十篇:扩展SOUI的控件及绘图对象(ISkinObj)
尽管SOUI已经内置了大部分常用的控件,很显然内置控件很难满足各种应用的形式各异的需求. 因此只有提供足够的扩展性才能满足真实应用场景. 除了将系统尽可能的组件化外,SOUI在控件自绘(SWindow ...
随机推荐
- SPOJ PGCD (mobius反演 + 分块)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意 :求满足gcd(i , j)是素数(1 &l ...
- COM编程入门第二部分——深入COM服务器
本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需 ...
- C# 面向对象 , 继承
继承 class A { Console.WriteLine("hello world"); } class B:A { } 以上书写,表示B 是A 的子类, B 同时继承A 中 ...
- css改变滚动条样式
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 10px; height: 12px; background-color: #F5 ...
- php获取某个目录下面文件的内容
if(!defined('PATH'))define('PATH', dirname(dirname(__FILE__)).'/');ini_set ( 'include_path', '.:' . ...
- JavaScript 函数作用域和闭包
函数作用域和闭包 词法作用域 它们在定义它们的作用域里运行,而不是在执行的作用域运行,但是只有在运行时,作用域链中的属性才被 定义(调用对象),此时,可访问任何当前的绑定. 调用对象 ...
- JavaScript 显示弹出窗口(二)
window. open ( sURL , sName , sFeatures , bReplace ) sURL:可选项,被加载页面的html sName:可选项,指定打开的窗口的名字 _media ...
- 前端要怎么学createjs!!!???
前端想做js开发,可以.但是思维要变通,思维要重塑.为啥?因为被div+css坑的有点深.这些都是我自己总结的,不知道其他人是不是这样. 在我看来div+css算是开发吗?肯定不是,这些东西有难的东西 ...
- 【行为型】Command模式
命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别 ...
- 在选择“Add Library Package reference”时提示:无法加在一个或多个请求的类型,有关更多信息,请检索LoaderException属性