`

画板的简单实现

 
阅读更多

       今天学习了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);  
            }  

          问题找到了,就此更改,我们把这个的语句去掉,仅仅去掉还不行,我们还要在第二次按下的时候设置一个断点来判定是第二次落笔,如此便能多次绘制线条。主要更改是:

 

  1.   去掉pointall=new ArrayList<Point>();
  2.  新建断点 p=new Point(0,0);
  3.  新增 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" />

 


 

       

  • 大小: 6 KB
  • 大小: 44.8 KB
  • 大小: 6.7 KB
  • 大小: 36.2 KB
分享到:
评论

相关推荐

    一个简易画板的实现 VS2010 QT4.8做的 C++

    一个简易画板的实现 有简单的画图,画图形,改颜色功能

    Java实现画板(Java小程序 模仿Win系统画板)

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个类似于Windows操作系统中的简易画板程序。这个Java小程序将提供基本的绘图功能,使用户能够通过鼠标或触控设备进行绘画创作。 首先,我们需要理解Java GUI...

    C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip

    C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip 基于Qt实现的简单绘画板程序。 ## 功能介绍 - 绘制点、直线、椭圆、矩形等基本几何图形; - 存储、读取绘图文件; - 撤回、重做等功能; - 调节线宽、线条...

    C# GDI简单画板的实现

    在本文中,我们将深入探讨如何使用C#和GDI+(Graphics Device Interface)来实现一个简单的画板应用程序。GDI+是.NET Framework中用于图形绘制的基础组件,它提供了丰富的功能,使得开发者可以创建出交互式的可视化...

    通过canvas实现简易画板

    刚开始学HTML5中的canvas,实现的一个简易的画板。(只注重了功能的实现,没有对样式添加太多)

    超级画板的实现

    在本文中,我们将深入探讨如何使用Microsoft Visual C++(VC++)和MFC(Microsoft Foundation Classes)库来实现一个“超级画板”项目。MFC是微软为Windows平台开发应用程序提供的一组C++类库,它简化了Windows API...

    简易画板的实现

    在这个简易画板应用中,用户可以通过手指在屏幕上画画,选择不同的颜色,并进行简单的绘图操作。 首先,我们要了解的是触摸事件处理。在Android平台上,这是通过`MotionEvent`类来完成的。当用户在屏幕上触摸或滑动...

    基于Java的简易几何画板的实现.pdf

    本文主要讲述了基于Java的简易几何画板的实现,通过简易几何画板的制作,简单介绍了Java图形编程方法。画板能够实现直线、曲线、长方形、正方形、椭圆和圆这些基本几何图形的绘制,并能够擦除和清除面板上已有的图形...

    易语言画板实现简单的验证码

    易语言画板实现简单的验证码。@风间琉璃。

    flash版画板,实现撤销、预览等功能

    在IT行业中,创建一个Flash版画板涉及到许多关键知识点,主要涵盖了ActionScript(AS)编程、用户界面设计以及交互功能的实现。以下是对标题和描述中提到的几个关键点的详细解释: 1. **Flash版画板**:Flash是一款...

    Android 实现画板功能

    在Android平台上实现一个画板功能是一项常见的需求,尤其在儿童教育、绘画应用或者创意设计类应用中。这个项目,名为"android-palette-master",显然提供了这样一个功能丰富的画板实现。下面将详细介绍其中的关键...

    vc简单画板实现

    在VC++环境中,实现一个简单的画板应用是一个基础但实用的编程练习,它涉及到图形用户界面(GUI)的创建、事件处理以及基本的绘图操作。这个“vc简单画板实现”项目通常会涵盖以下几个核心知识点: 1. MFC...

    java swing简单画板

    综上所述,"java swing简单画板"项目涵盖了Java GUI编程的基础知识,包括Swing组件的使用、绘图功能的实现、事件处理以及布局管理。开发者通过这些技术,为用户提供了一个简易但功能齐全的画板工具,满足了基本的...

    java 实现 画板程序

    在本例中,我们将探讨如何利用Java实现一个简单的画板程序,该程序允许用户绘制直线、长方形、椭圆和曲线。 1. **基础架构** - 主类`painter`通过`JFrame`创建了一个窗口,设置了背景颜色为白色,并添加了一个`...

    画板.zip画板简单的例子

    标题中的“画板.zip画板简单的例子”表明这是一个关于简易画板应用的示例项目,可能包含源代码、资源文件和说明文档等。这个画板应用程序允许用户进行绘画操作,如选择不同粗细的画笔绘制线条,选择多种颜色,清空...

    java实现画板的基本功能程序

    在Java编程语言中,开发一个画板程序是一...通过以上步骤,我们可以构建一个功能完备的画板程序,让用户体验到类似专业绘图软件的简单易用性。使用Java轻量级组件,我们可以确保程序在不同平台上具有一致的外观和行为。

    图形画板简单demo

    《图形画板简单demo》 在信息技术领域,图形画板是一种常见的交互式应用程序,它允许用户在屏幕上绘制各种图形,包括线条、矩形、椭圆等。本项目名为"图形画板简单demo",旨在提供一个基础的绘图平台,让用户能够...

    基于python实现画板程序.zip

    【标题】:基于Python实现画板程序 在Python编程领域,开发一个简单的画板程序是一项常见的课程设计任务,它能够帮助初学者理解图形用户界面(GUI)编程的基本概念。本项目名为“基于python实现画板程序”,其核心...

    简单画板实现

    在IT领域,"简单画板实现"通常是指创建一个用户界面,允许用户通过鼠标或触控设备进行绘图。这个项目可能是一个基本的图形用户界面应用程序,模仿了计算机操作系统中常见的"画板"工具,如Windows的“画图”程序。...

    IOS 画板的实现

    这个"iOS画板的实现"涉及到多个技术点,包括图形绘制、触摸事件处理、撤销/重做功能以及保存用户的创作。下面我们将详细探讨这些知识点。 首先,iOS中的图形绘制主要依赖于Core Graphics框架。该框架提供了低级的2D...

Global site tag (gtag.js) - Google Analytics