今天学习了Android的画板的设计,涉及的内容有Android的Touch事件、Spinner组件的应用,当然还有画板的画布,画笔等相关的知识,下面来说说我的设计过程。
本文的设计主要参照另外一个博主的代码,在他的基础上进行了修改,链接:http://429899791.iteye.com/blog/2196928。
由于原来的博主的代码比较详细,我主要讲的是自己增加或者更改的东西。
更改一:
原来的画板只能在画板上绘制一条线,即提笔之后再次下笔原来的内容就会消失,更改之后可以重复绘制多个线条。
如下代码:
public boolean onTouch(View v, MotionEvent e) { // TODO Auto-generated method stub Point p=new Point((int)e.getX(),(int)e.getY()); if(e.getAction()==e.ACTION_DOWN){ //当按下 pointall=new ArrayList<Point>(); //这里每次按下屏幕便会重新新建一个数组,便会把原来的数组的东西消失 pointall.add(p); }
问题找到了,就此更改,我们把这个的语句去掉,仅仅去掉还不行,我们还要在第二次按下的时候设置一个断点来判定是第二次落笔,如此便能多次绘制线条。主要更改是:
- 去掉pointall=new ArrayList<Point>();
- 新建断点 p=new Point(0,0);
- 新增 if(first.x==0||last.x==0) //判定为断点,用continue语句跳出连接下一个点的语句。
Touch类更改如下:
private class Touch implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent e) { // TODO Auto-generated method stub Point p=new Point((int)e.getX(),(int)e.getY()); if(e.getAction()==e.ACTION_DOWN){ //当按下 p=new Point(0,0);//设置断点,来绘制新的线条 pointall.add(p); } else if(e.getAction()==e.ACTION_UP){//当抬起 pointall.add(p); paintview.this.postInvalidate(); //重绘 } else if(e.getAction()==e.ACTION_MOVE){ pointall.add(p); //移动时候 paintview.this.postInvalidate(); //重绘 } return true; } } protected void onDraw(Canvas canvas){ Paint p=new Paint(); //定义画笔 p.setColor(Color.RED); //定义颜色 if(pointall.size()>1){ Iterator<Point> iter=pointall.iterator();// 现在有坐标点保存的时候可以开始进行绘图 Point first=null; Point last=null; while(iter.hasNext()){ if(first==null){ first=(Point)iter.next(); } else{ if(last!=null){ first=last; //将下一个坐标点赋给上面的 } last=(Point)iter.next(); //不停下指 if(first.x==0||last.x==0) //判定为断点,用continue语句跳出连接下一个点的语句 continue; canvas.drawLine(first.x, first.y, last.x, last.y,p); } } } }
更改二:新增画笔颜色和画笔粗细的功能
首先讲一下Spinning下拉框的使用(因为学习的时候上网查这个,感觉很多是混合着其他东西的,看起来比较复杂):
1.设计页面用Spinning标签:
<Spinner android:id="@+id/colortext" android:layout_width="97dp" android:layout_height="match_parent" android:entries="@array/data" android:spinnerMode="dialog" />
2.在res包的values里面新建一个xml文件来存放下拉框内容的数组,data是颜色的内容,data1是笔大小的内容,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <resources> <string-array name="data"> <item>红色</item> <item>蓝色</item> <item>黑色</item> </string-array> <string-array name="data1"> <item>细</item> <item>中</item> <item>粗</item> </string-array> </resources>
3.新建监听事件:
color=(Spinner)findViewById(R.id.colortext); color.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub color1= (String) color.getSelectedItem(); if(color1.equals("红色")) paintview.color1=-1; else if(color1.equals("黑色")) paintview.color1=0; else if(color1.equals("蓝色")) paintview.color1=-2; } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } });
弄完了相关准备工作,然后就是在原理的代码里面要把颜色和笔大小的属性进行设置,考虑到每次更换笔颜色和大小都会停笔更改,所以把这些属性赋值给断点这里处理,因为前面设置了x坐标来判定是否断点,所以我们利用y坐标来判定设置了什么颜色和大小。
新设置断点信息:
if(e.getAction()==e.ACTION_DOWN){ //当按下 p=new Point(0,color1);//color1是下拉框选择的颜色的值 pointall.add(p); p=new Point(0,pen);//pen是画笔大小的值 pointall.add(p); // pointall =new ArrayList<Point>(); }
增加判断笔颜色和设置大小:
//判断笔的颜色 if(first.y==0)p.setColor(Color.BLACK);//设置为黑色 else if(first.y==-1)p.setColor(Color.RED);//设置为红色 else if(first.y==-2)p.setColor(Color.BLUE);//设置为蓝色 //判断笔大小 if(first.y==-10)p.setStrokeWidth(10);//设置笔大小为10 else if(first.y==-20)p.setStrokeWidth(20);//设置笔大小为20 else if(first.y==-30)p.setStrokeWidth(30);//设置笔大小为30
最终paintview代码如下:
public class paintview extends View{ private List<Point> pointall=new ArrayList<Point>(); static int color1=-1; static int pen=-10; public paintview(Context context, AttributeSet attrs) { super(context, attrs); super.setBackgroundColor(Color.WHITE); super.setOnTouchListener(new Touch()); } private class Touch implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent e) { // TODO Auto-generated method stub Point p=new Point((int)e.getX(),(int)e.getY()); if(e.getAction()==e.ACTION_DOWN){ //当按下 p=new Point(0,color1);//color1是下拉框选择的颜色的值 pointall.add(p); p=new Point(0,pen);//pen是画笔大小的值 pointall.add(p); // pointall =new ArrayList<Point>(); } else if(e.getAction()==e.ACTION_UP){//当抬起 pointall.add(p); paintview.this.postInvalidate(); //重绘 } else if(e.getAction()==e.ACTION_MOVE){ pointall.add(p); //移动时候 paintview.this.postInvalidate(); //重绘 } return true; } } protected void onDraw(Canvas canvas){ Paint p=new Paint(); //定义画笔 //定义颜色 if(pointall.size()>1){ Iterator<Point> iter=pointall.iterator();// 现在有坐标点保存的时候可以开始进行绘图 Point first=null; Point last=null; while(iter.hasNext()){ if(first==null){ first=(Point)iter.next(); } else{ if(last!=null){ first=last; //将下一个坐标点赋给上面的 } last=(Point)iter.next(); //不停下指 //判断笔的颜色 if(first.y==0)p.setColor(Color.BLACK);//设置为黑色 else if(first.y==-1)p.setColor(Color.RED);//设置为红色 else if(first.y==-2)p.setColor(Color.BLUE);//设置为蓝色 //判断笔大小 if(first.y==-10)p.setStrokeWidth(10);//设置笔大小为10 else if(first.y==-20)p.setStrokeWidth(20);//设置笔大小为20 else if(first.y==-30)p.setStrokeWidth(30);//设置笔大小为30 if(first.x==0||last.x==0) continue; // p.setStrokeWidth(10); canvas.drawLine(first.x, first.y, last.x, last.y,p); } } } } }
MainActivity代码如下:
public class MainActivity extends Activity { private Spinner color; private Spinner pen; public String color1="红色"; private String pen1="细"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //监听得到画笔的颜色 color=(Spinner)findViewById(R.id.colortext); color.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub color1= (String) color.getSelectedItem(); if(color1.equals("红色")) paintview.color1=-1; else if(color1.equals("黑色")) paintview.color1=0; else if(color1.equals("蓝色")) paintview.color1=-2; } @Override public void onNothingSelected(AdapterView<?> parent) { } }); //监听得到画笔的大小 pen=(Spinner)findViewById(R.id.pentext); pen.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub pen1= (String) pen.getSelectedItem(); if(pen1.equals("细")) paintview.pen=-10; else if(pen1.equals("中")) paintview.pen=-20; else if(pen1.equals("粗")) paintview.pen=-30; } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } });}
最终效果如下:
最后提一下这次新学的一个知识,就是paintview的类可以直接嵌入MainActivity里面,这样画板会填充到主页面里面,这样不需要这个类新建一个xml文件来做页面,只要在activity_main加上如下声明:
<com.example.paint.paintview android:id="@+id/paintview" android:layout_width="fill_parent" android:layout_height="fill_parent" />
相关推荐
一个简易画板的实现 有简单的画图,画图形,改颜色功能
在本文中,我们将深入探讨如何使用Java编程语言来实现一个类似于Windows操作系统中的简易画板程序。这个Java小程序将提供基本的绘图功能,使用户能够通过鼠标或触控设备进行绘画创作。 首先,我们需要理解Java GUI...
C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip 基于Qt实现的简单绘画板程序。 ## 功能介绍 - 绘制点、直线、椭圆、矩形等基本几何图形; - 存储、读取绘图文件; - 撤回、重做等功能; - 调节线宽、线条...
在本文中,我们将深入探讨如何使用C#和GDI+(Graphics Device Interface)来实现一个简单的画板应用程序。GDI+是.NET Framework中用于图形绘制的基础组件,它提供了丰富的功能,使得开发者可以创建出交互式的可视化...
刚开始学HTML5中的canvas,实现的一个简易的画板。(只注重了功能的实现,没有对样式添加太多)
在本文中,我们将深入探讨如何使用Microsoft Visual C++(VC++)和MFC(Microsoft Foundation Classes)库来实现一个“超级画板”项目。MFC是微软为Windows平台开发应用程序提供的一组C++类库,它简化了Windows API...
在这个简易画板应用中,用户可以通过手指在屏幕上画画,选择不同的颜色,并进行简单的绘图操作。 首先,我们要了解的是触摸事件处理。在Android平台上,这是通过`MotionEvent`类来完成的。当用户在屏幕上触摸或滑动...
本文主要讲述了基于Java的简易几何画板的实现,通过简易几何画板的制作,简单介绍了Java图形编程方法。画板能够实现直线、曲线、长方形、正方形、椭圆和圆这些基本几何图形的绘制,并能够擦除和清除面板上已有的图形...
易语言画板实现简单的验证码。@风间琉璃。
在IT行业中,创建一个Flash版画板涉及到许多关键知识点,主要涵盖了ActionScript(AS)编程、用户界面设计以及交互功能的实现。以下是对标题和描述中提到的几个关键点的详细解释: 1. **Flash版画板**:Flash是一款...
在Android平台上实现一个画板功能是一项常见的需求,尤其在儿童教育、绘画应用或者创意设计类应用中。这个项目,名为"android-palette-master",显然提供了这样一个功能丰富的画板实现。下面将详细介绍其中的关键...
在VC++环境中,实现一个简单的画板应用是一个基础但实用的编程练习,它涉及到图形用户界面(GUI)的创建、事件处理以及基本的绘图操作。这个“vc简单画板实现”项目通常会涵盖以下几个核心知识点: 1. MFC...
综上所述,"java swing简单画板"项目涵盖了Java GUI编程的基础知识,包括Swing组件的使用、绘图功能的实现、事件处理以及布局管理。开发者通过这些技术,为用户提供了一个简易但功能齐全的画板工具,满足了基本的...
在本例中,我们将探讨如何利用Java实现一个简单的画板程序,该程序允许用户绘制直线、长方形、椭圆和曲线。 1. **基础架构** - 主类`painter`通过`JFrame`创建了一个窗口,设置了背景颜色为白色,并添加了一个`...
标题中的“画板.zip画板简单的例子”表明这是一个关于简易画板应用的示例项目,可能包含源代码、资源文件和说明文档等。这个画板应用程序允许用户进行绘画操作,如选择不同粗细的画笔绘制线条,选择多种颜色,清空...
在Java编程语言中,开发一个画板程序是一...通过以上步骤,我们可以构建一个功能完备的画板程序,让用户体验到类似专业绘图软件的简单易用性。使用Java轻量级组件,我们可以确保程序在不同平台上具有一致的外观和行为。
《图形画板简单demo》 在信息技术领域,图形画板是一种常见的交互式应用程序,它允许用户在屏幕上绘制各种图形,包括线条、矩形、椭圆等。本项目名为"图形画板简单demo",旨在提供一个基础的绘图平台,让用户能够...
【标题】:基于Python实现画板程序 在Python编程领域,开发一个简单的画板程序是一项常见的课程设计任务,它能够帮助初学者理解图形用户界面(GUI)编程的基本概念。本项目名为“基于python实现画板程序”,其核心...
在IT领域,"简单画板实现"通常是指创建一个用户界面,允许用户通过鼠标或触控设备进行绘图。这个项目可能是一个基本的图形用户界面应用程序,模仿了计算机操作系统中常见的"画板"工具,如Windows的“画图”程序。...
这个"iOS画板的实现"涉及到多个技术点,包括图形绘制、触摸事件处理、撤销/重做功能以及保存用户的创作。下面我们将详细探讨这些知识点。 首先,iOS中的图形绘制主要依赖于Core Graphics框架。该框架提供了低级的2D...