`
hmeng
  • 浏览: 15829 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

画板感想与小结

阅读更多
   至画板重绘,我的画板已基本实现主要功能了,虽然还有很多需要完善,但看到自己做出的成果能够感到真正发自内心的愉悦,原来自己也能做出以前觉得很神奇的东西,每一次运行成功,得到想要结果时都会忍不住发出一声“哇塞!”,顿时倍感满足和开心。
    尽管以后肯定会觉得这个是特别简单的小工程,不过当付出自己的时间和精力去完成,并得到想要的结果时那种成就感和满足感真的令人痴迷,其实这也是我每一次努力做每一件事所追求的简单目标,我确实没有雄心壮志去完成一件事,多么,多么的惊天动地的一件事,有时这是一件坏事,可有时因为简单的目标容易实现,不也更容易感到满足和高兴么?
    总会遇到各种各样的Bug,粗心也好,逻辑问题也好,格式错误也罢,只有经过Bug的磨练才能更加为自己解决问题实现运行而感到满足。开始时真的是对界面设计一点都不懂,因为自己写代码老是有Bug,看到红色的Bug就感到心凉,烦躁,觉得好浪费时间,三五次下来就没有动力去写代码了,于是看熊哥的代码,有时就完全对着抄一下,只为完成任务,这样的效果肯定是不好的,也并没有自己的成就感,现在完成了画板,虽然不是自己完全重新靠自己写的,但是我会继续努力哒,因为实现代码的结果的成就感也能成为一种动力,认真去学习,好好消化每次所学的知识变为自己的理解,提高自己的能力。

  再总结下自己经常出现比较弱智的Bug的问题吧
1、JAVA内部类的类名避免写错,比如重写监听器方法mousepressed开头字母写成大写(后来发现其实很多不用自己写的,避免自己写错)。
2、if条件语句的使用,if(1)这是错误的,括号内只能用bool型或其他条件判断语句 尽量用if(){} else if(){}(以防出错)。
3、防止空指针异常有些变量赋初值(计算器的功能实现中)。
4、类型转换,字符型整型浮点型互换。。
5、要在窗体显示后取画布。
6、在鼠标监听器方法中才可以对事件源getButton。。
7、出现异常时可通过不同位置输出标记查找问题源。

  另外,我希望有机会可以把这个画板做成手机APP的软件,这样在手机中打开自己做的APP感觉特别炫酷。

贴上自己的代码:
(1)画板界面设计部分
public class XPDraw {
	private JFrame jf;//设置窗体为属性
	private String shape="Line";
	private Color fcolor;
	private Color bcolor;
	private int size=1;
	private JButton left;
	private JButton right;

	public String getShape(){
		return shape;
	}
	public Color getfColor(){
		return fcolor;
	}
	public Color getbColor(){
		return bcolor;
		
	}
	public int getSize(){
	    return	size;
	}

	public static void main(String[] args) {
		XPDraw XP=new XPDraw();
		XP.draw();
	}

	private void draw() {
		jf=new JFrame();
		//设置窗体属性
		jf.setTitle("HM画板");
		jf.setSize(800, 600);
		jf.setDefaultCloseOperation(3);
		jf.setLocationRelativeTo(null);
		//调用创建菜单栏的方法
		this.Manu();
		//调用创建工具栏的方法
		this.Tools();
		//调用创建颜色栏的方法
		this.Colors();
		//调用创建绘图板的方法
		JPanel draw=this.Drawpanel();
		//设置窗口可见
		jf.setVisible(true);
		//取画布
		Graphics g=draw.getGraphics();
		//给画布面板添加监听器方法
		DrawListener al=new DrawListener (g,this);
		draw.addMouseListener(al);
		draw.addMouseMotionListener(al);
	}
//定义创建绘画板的方法
	private JPanel Drawpanel() {
		//实例化一个中间面板
		JPanel center =new JPanel(){
			//重写绘画方法
			public void paint(Graphics g){
				//调用父类的
				super.paint(g);
				for(int i=0;i<DrawListener.cnt;i++){
					//得到数组中元素
					Shape shape=DrawListener.array[i];
					shape.draw((Graphics2D)g);
				}
			}
		};
			
		
		
		center.setLayout(new FlowLayout(FlowLayout.LEFT));
		center.setBackground(Color.gray);
		//把其面板添加到窗体中央
		jf.add(center,BorderLayout.CENTER);	
		
		//实例化一个绘画板
		JPanel draw=new JPanel();
		draw.setPreferredSize(new Dimension(650,400));
		//设置其背景色为白色
		draw.setBackground(Color.white);
		center.add(draw);
		//返回绘画面板
		return draw;
	}
//定义创建颜色栏的方法
	private void Colors() {
		JPanel colors=new JPanel();
		//设置为流式布局靠左,大小
		colors.setLayout(new FlowLayout(FlowLayout.LEFT));
		colors.setPreferredSize(new Dimension(0,50));
		jf.add(colors,BorderLayout.SOUTH);
		
		//实例化一个面板
		JPanel pane=new JPanel();
		pane.setPreferredSize(new Dimension(40,40));
		pane.setLayout(null);
		//实例化两个按钮,并添加到面板上
		left=new JButton();
		right=new JButton();
		left.setBounds(10, 10, 15, 15);
		left.setBackground(Color.black);
		right.setBounds(15, 15, 16, 16);
		right.setBackground(Color.white);
		
		pane.add(left);
		pane.add(right);
		//把双色面板添加到颜色面板上
		colors.add(pane);
		
		//实例化一个面板对象,设置网格布局
		JPanel panel=new JPanel();
		panel.setLayout(new GridLayout(2,2));
		 
		Color arr[]={Color.BLACK,Color.RED,Color.blue,Color.GRAY,Color.GREEN,Color.YELLOW,Color.PINK,Color.LIGHT_GRAY,
					Color.ORANGE,Color.WHITE,Color.DARK_GRAY,new Color(100,200,255),new Color(10,188,220),new Color(200,60,80),
					new Color(200,0,230),new Color(240,180,103)};		
		for(int i=0;i<arr.length;i++){
			JButton col=new JButton();
			col.setBackground(arr[i]);
			col.setPreferredSize(new Dimension(15,15));
			//添加到面板上
			panel.add(col);
			//使用匿名内部类
			col.addMouseListener(new MouseListener() {
				public void mouseReleased(MouseEvent e) {}
				public void mousePressed(MouseEvent e) {}
				public void mouseExited(MouseEvent e) {}
				public void mouseEntered(MouseEvent e) {}
				public void mouseClicked(MouseEvent e) {
					if(e.getButton()==1){
						//获取事件源按钮
						JButton bu=(JButton) e.getSource();
						//获取事件源对象得背景色
						fcolor=bu.getBackground();	
						left.setBackground(fcolor);
						}
			    	if(e.getButton()==3){
						//获取事件源按钮
						JButton bu=(JButton) e.getSource();
						//获取事件源对象得背景色
						bcolor=bu.getBackground();	
						right.setBackground(bcolor);
						}
					
					
				}
			});
		}
		colors.add(panel);
		
	}
//定义创建工具栏的方法
	private void Tools() {
		JPanel jp=new JPanel();
		//设置面板属性位置
		jp.setPreferredSize(new Dimension(60,0));
		jf.add(jp,BorderLayout.WEST);

		//添加图形按钮
		String []array={"images/line.png","images/eraser.png","images/pencil.png","images/rectangular.png",
				"images/brush.png","images/椭圆.png","images/圆角矩形.png","images/喷枪.png","images/001.jpg","images/rec.jpg","images/多边形.png","images/填充.png"};
		for(int i=0;i<array.length ;i++){
			ImageIcon icon=new ImageIcon(array[i]);
			//将图片放到按钮上
			JButton jb=new JButton(icon);
			jb.setActionCommand(""+i);
			//设置按钮大小
			jb.setPreferredSize(new Dimension(25,25));
			//给每个按钮添加监听器方法,使用匿名内部类
			
			jb.addActionListener(new ActionListener(){

				public void actionPerformed(ActionEvent e) {
					if(e.getActionCommand().equals("0")){
						shape="Line";
					}if(e.getActionCommand().equals("1")){
						shape="Eraser";
					}if(e.getActionCommand().equals("2")){
						shape="Pencil";
					}if(e.getActionCommand().equals("3")){
						shape="fillRect";
					}if(e.getActionCommand().equals("4")){
						shape="Brush";
					}if(e.getActionCommand().equals("5")){
						shape="Circle";
					}if(e.getActionCommand().equals("6")){
						shape="RoundRect";
					}if(e.getActionCommand().equals("7")){
				        shape="Spray";
					}if(e.getActionCommand().equals("8")){
			            shape="Dshape";
			        }if(e.getActionCommand().equals("9")){
				        shape="Rect";
			        }if(e.getActionCommand().equals("10")){
			        	shape="3Drect";
			        }if(e.getActionCommand().equals("11")){
			        	shape="TC";
			        }
				}
			});
			//添加到工具栏面板
			jp.add(jb);	
		}
			//实例化一个面板设置线条粗细
			JPanel jpl=new JPanel();
			//设置面板属性
			jpl.setBackground(Color.LIGHT_GRAY);
			jpl.setPreferredSize(new Dimension(45,80));
			//添加到面板上
			jp.add(jpl);
	
			//添加图形按钮
			String []arr={"images/2.jpg","images/3.jpg","images/4.jpg","images/5.jpg","images/6.jpg"};
			for(int i=0;i<arr.length;i++){
				ImageIcon icn=new ImageIcon(arr[i]);
				//实例化按钮
				JButton bt=new JButton(icn);
				//设置命令属性
				bt.setActionCommand(""+(i+1));//!!!
				//设置大小
				bt.setPreferredSize(new Dimension(40,10));
				//给每个按钮添加监听器方法,使用匿名内部类
				bt.addActionListener(new ActionListener(){
					@Override
					public void actionPerformed(ActionEvent e) {
						//System.out.print("++++++++++"+size);
						if(e.getActionCommand().equals("1")){
							size=2;
						//System.out.print("--------"+size);
						}
						else if(e.getActionCommand().equals("2")){
							size=5;						
						}
						else if(e.getActionCommand().equals("3"))
							size=10;
						else if(e.getActionCommand().equals("4"))
							size=18;
						if(e.getActionCommand().equals("5"))
							size=25;		
					}
					
				});
			
				//添加到该面板上
				jpl.add(bt);
	
			}
			
			
			
		
		
	}
//定义创建菜单栏的方法
	private void Manu() {
		//实例化一个JMenuBar作为菜单栏
		JMenuBar jm=new JMenuBar();
		//利用数组储存
		String Array[]={"文件","编辑","查看","图像","颜色","帮助"};
		String ArrayItem[][]={{"新建","打开","保存","另存为"},{"撤销","剪切","复制","粘贴"},{"工具箱","浏览","历史记录"},{"浏览文件"},{"颜色选择器"},{"帮助"}};
		for(int i=0;i<Array.length;i++){
			//实例化菜单选项
			JMenu mu=new JMenu(Array[i]);
			for(int j=0;j<ArrayItem[i].length;j++){
				//实例化菜单选项的子项
				JMenuItem mui=new JMenuItem(ArrayItem[i][j]);
				//添加到选项中
				mu.add(mui);
			}
			//把菜单选项添加到菜单栏
			jm.add(mu);
		}
		//设置其为窗体菜单栏对象
		jf.setJMenuBar(jm);
	}
}

(2)监听器处理方法部分
public class DrawListener extends MouseAdapter {

	
	private int x1, y1, x2, y2;
	private Graphics g;
	private XPDraw xp;//图形属性
	private int n = 1;
	private int x3, y3, x4, y4;
	private Color col;

	
	public static Shape [] array = new Shape[10000];//用来存储图形,静态变量用来方便外部调用
	public static int cnt = 0;//记录元素总数

	public DrawListener(Graphics g, XPDraw xp) {
		this.g = g;
		this.xp = xp;
		
	}

	public void mousePressed(MouseEvent e) {
		x1 = e.getX();
		y1 = e.getY();
		// 设置图形颜色
		if (e.getButton() == 1) {
			col=xp.getfColor();
		} else if (e.getButton() == 3) {
			col=xp.getbColor();
		}
		g.setColor(col);

	}

	public void mouseReleased(MouseEvent e) {
		x2 = e.getX();
		y2 = e.getY();
		//获取图形的形状
		String s = xp.getShape();
		System.out.println("will draw shape is:" + s);
		//绘制直线
		if (s.equals("Line")) {
			
			//实例化一个对象
			Shape sp=new ShapeLine(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制直线
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
		}// 在画布上画矩形
		if (s.equals("Rect")) {
			
			//实例化一个对象
			Shape sp=new ShapeRect(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制矩形
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			
		}
         if (s.equals("fillRect")) {
			
			//实例化一个对象
			Shape sp=new ShapeRect(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制矩形
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			
		}
		//画圆角矩形
		if(s.equals("RoundRect")){
			
			//实例化一个对象
			Shape sp=new ShapeRect(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制矩形
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			
		}
		// 画圆
		if (s.equals("Circle")) {
			
			//实例化一个对象
			Shape sp=new ShapeOval(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制圆
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
		}//3D图形
		if(s.equals("3Drect")){
		
			for(int i=0;i<30;i++ ){
				Color c=new Color(255-8*i,255-8*i,255-8*i);
				//实例化一个对象
				Shape sp=new ShapeRect(x1+i,y1+i,x2+i,y2+i,c,s,xp.getSize());
				//绘制矩形
				sp.draw((Graphics2D)g);
				//把图形记录到数组
				array[cnt]=sp;
				cnt++;
			}
			
		}
		// 喷枪
		if (s.equals("Spray")) {
		
			for (int i = 0; i < 40; i++) {
				Random ran = new Random();
				// 取随机数0-29
				int s1 = ran.nextInt(30) - 15;
				int s2 = ran.nextInt(20) - 10;
				// 画点
				//实例化一个对象
				Shape sp=new ShapeLine(x1-s1,y1-s2,x2-s1,y2-s2,col,s,xp.getSize());
				//绘制直线
				sp.draw((Graphics2D)g);
				//把图形记录到数组
				array[cnt]=sp;
				cnt++;
				//实例化一个对象
				sp=new ShapeLine(x1+s1,y1+s2,x2+s1,y2+s2,col,s,xp.getSize());
				//绘制直线
				sp.draw((Graphics2D)g);
				//把图形记录到数组
				array[cnt]=sp;
				cnt++;
			}
		}	
		// 多边形
		if (n == 1 && s.equals("Dshape")) {
			// 画出第一条直线'
			System.out.println("====>");
			//实例化一个对象
			Shape sp=new ShapeLine(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制直线
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			x3 = x1;
			y3 = y1;
			x4 = x2;
			y4 = y2;
			n = 0;
		}
	}
	
	public void mouseClicked(MouseEvent e) {
		if (n == 0 && xp.getShape().equals("Dshape")) {
			int x = e.getX();
			int y = e.getY();
			//实例化一个对象
			Shape sp=new ShapeLine(x4,y4,x,y,col,xp.getShape(),xp.getSize());
			//绘制直线
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			// 判断是否双击
			if (x == x4 && y == y4) {
				//实例化一个对象
				sp=new ShapeLine(x,y,x3,y3,col,xp.getShape(),xp.getSize());
				//绘制直线
				sp.draw((Graphics2D)g);
				//把图形记录到数组
				array[cnt]=sp;
				cnt++;
				n = 1;
			}
			// 把坐标转存
			x4 = x;
			y4 = y;
		}
	}

	public void mouseDragged(MouseEvent e) {
		String s = xp.getShape();
		if (s.equals("Pencil")) {// 用画笔在画布上画曲线
			x2 = e.getX();
			y2 = e.getY();
	
			//实例化一个对象
			Shape sp=new ShapeLine(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制直线
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			
			x1 = x2;// 交换首尾值
			y1 = y2;
			
		}
		if (s.equals("Eraser")) {// 在画布上擦除
			x2 = e.getX();
			y2 = e.getY();
			g.setColor(Color.white);// 设置图形颜色为白色
			//实例化一个对象
			Shape sp=new ShapeLine(x1,y1,x2,y2,Color.white,s,xp.getSize());
			//绘制直线
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			
		
			x1 = x2;// 交换首尾值
			y1 = y2;
		}
		// 刷子
		if (s.equals("Brush")) {
			x2 = e.getX();
			y2 = e.getY();
			
			//实例化一个对象
			Shape sp=new ShapeLine(x1,y1,x2,y2,col,s,xp.getSize());
			//绘制直线
			sp.draw((Graphics2D)g);
			//把图形记录到数组
			array[cnt]=sp;
			cnt++;
			
			x1 = x2;// 交换首尾值
			y1 = y2;
		}
	}

}


(3)图形抽象类以及实现该抽象类的类
public abstract class Shape {
	private int x1, y1, x2, y2;
	private Color color;
	private String shapes;
	private int size;
	
	public Shape(int x1,int y1,int x2,int y2,Color color,String shapes,int size){
		this.x1=x1;
		this.x2=x2;
		this.y1=y1;
		this.y2=y2;
		this.color=color;
		this.shapes=shapes;
		this.size=size;
	}
	
	public Color getColor(){
		return color;
	}
	
	public String getShape(){
		return shapes;
	}
	
	public int getX1(){
		return x1;
	}
	
	public int getX2(){
		return x2;
	}
	
	public int getY1(){
		return y1;
	}
	
	public int getY2(){
		return y2;
	}
	public int getSize(){
		return size;
	}
	
	public abstract void draw(Graphics2D g);
	

}


public class ShapeLine extends Shape{

	public ShapeLine(int x1, int y1, int x2, int y2, Color color, String shapes, int size) {
		super(x1, y1, x2, y2, color, shapes, size);//调用父类的构造方法
		
	}

	@Override
	public void draw(Graphics2D g) {
		g.setColor(getColor());//设置颜色
		//设置笔画大小
		((Graphics2D) g).setStroke(new BasicStroke(getSize()));
		//绘制直线
		g.drawLine(getX1(), getY1(), getX2(), getY2());
		
		
		
	}
	

}


public class ShapeOval extends Shape{
    //定义构造方法
	public ShapeOval(int x1, int y1, int x2, int y2, Color color, String shapes, int size) {
		super(x1, y1, x2, y2, color, shapes,size);
		
	}

	@Override
	public void draw(Graphics2D g) {
		g.setColor(getColor());
		//设置笔画大小
		((Graphics2D) g).setStroke(new BasicStroke(getSize()));
		//画椭圆
		g.drawOval(Math.min(getX1(), getX2()),Math.min( getY1(),getY2()), Math.abs(getX2() - getX1()), Math.abs(getY2() - getY1()));
		
		
	}

}


public class ShapeRect extends Shape{

	public ShapeRect(int x1, int y1, int x2, int y2, Color color, String shapes,int size) {
		super(x1, y1, x2, y2, color, shapes,size);
		
	}

	@Override
	public void draw(Graphics2D g) {
		g.setColor(getColor());//设置颜色
		//设置笔画大小
		((Graphics2D) g).setStroke(new BasicStroke(getSize()));
		//绘制长方形
		if(this.getShape().equals("Rect"))
		    g.drawRect(Math.min(getX1(), getX2()),Math.min( getY1(),getY2()), Math.abs(getX2() - getX1()), Math.abs(getY2() - getY1()));
		//绘制圆角矩形
		else if (this.getShape().equals("RoundRect"))
			g.drawRoundRect(Math.min(getX1(),getX2()), Math.min(getY1(), getY2()), Math.abs(getX2()-getX1()), Math.abs(getY2()-getY1()), 20, 20);
		else if(this.getShape().equals("3Drect"))
			g.drawRect(Math.min(getX1(), getX2()),Math.min( getY1(),getY2()), Math.abs(getX2() - getX1()), Math.abs(getY2() - getY1()));
		else if(this.getShape().equals("fillRect"))
			g.fillRect(Math.min(getX1(), getX2()),Math.min( getY1(),getY2()), Math.abs(getX2() - getX1()), Math.abs(getY2() - getY1()));
	}

}


这是界面的效果图  

  • 大小: 77 KB
1
0
分享到:
评论

相关推荐

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

    这个Java小程序将提供基本的绘图功能,使用户能够通过鼠标或触控设备进行绘画创作。 首先,我们需要理解Java GUI(图形用户界面)的基础。在Java中,我们可以使用Swing或JavaFX库来创建图形界面。在这个项目中,...

    Java 编写的小型画板

    【Java 编写的小型画板】是一款基于Java编程语言实现的简单图形界面应用程序,它为用户提供了基础的绘图功能,包括绘制椭圆、方形和直线,并支持颜色选择和自定义图形添加。这款画板软件是Java初学者或者进行图形...

    微信小程序 Canvas 画板、签名板Demo

    微信小程序 Canvas 画板与签名板的开发是一个技术性较强的话题,它涉及到微信小程序的API使用、HTML5的Canvas元素以及交互设计等多个方面。在这个Demo中,开发者提供了一个功能丰富的画板组件,允许用户进行画图、...

    涂鸦画板小程序.zip微信小程序模板源码

    涂鸦画板小程序是一款基于微信小程序开发的模板应用,它为用户提供了一个自由创作、涂鸦的平台。这个项目源码的发布,对于开发者而言,是一个极好的学习和参考资源,可以深入了解微信小程序的开发流程和相关技术。 ...

    完整的安卓画板源代码 Android小画板

    【Android小画板】是一个基于安卓平台开发的画板应用,它提供了丰富的绘画功能,让用户可以在手机或平板设备上自由创作。这个开源项目是开发者在网上的搜索与学习过程中找到的,并决定分享出来,以便更多的人能学习...

    火山安卓高级画板实现画板开发源码.rar

    火山安卓高级画板实现画板开发源码

    几何画板自定义工具包-800多个小工具

    这款“几何画板自定义工具包”包含800多个精心设计的小工具,极大地扩展了软件的功能,使得用户在操作几何画板时能够更加便捷和高效。 1. **自定义工具的概念** 在几何画板中,自定义工具是用户或开发者根据需求...

    易语言画板透明去色

    在易语言中,我们可以创建一个窗口程序,并在其上添加画板控件,用户可以通过鼠标或键盘与之交互。 透明度调整涉及到的是图像的Alpha通道。Alpha通道是RGB颜色模型的一个扩展,用于表示像素的透明程度。0代表完全...

    windows小画板程序

    "Windows小画板程序"是基于C++编程语言实现的一个简易版画图应用程序,它旨在模仿并实现微软操作系统内置的“画图”程序的一些基本功能。这个程序可能并不包含所有高级特性,但提供了核心的绘图操作,如选择颜色、...

    几何画板最强中文永久免费5.06版本安装包下载解压安装即可

    几何画板最强中文永久免费5.06版本安装包下载解压安装即可几何画板最强中文永久免费5.06版本安装包下载解压安装即可几何画板最强中文永久免费5.06版本安装包下载解压安装即可几何画板最强中文永久免费5.06版本安装包...

    javaGUI小画板

    在Java GUI小画板中,开发者利用Java Swing或JavaFX库来创建用户界面,这些库提供了丰富的组件和工具,使用户可以轻松地与图形界面交互。用户可以打开图片,尤其是二值化图片,这是一个将图像转换为黑白的过程,常...

    iOS画板功能小demo

    这个"iOS画板功能小demo"是一个示例项目,展示了如何实现这样的功能。下面我们将深入探讨这个项目的核心知识点。 1. 自定义视图(UIView):在iOS应用中,画板通常是通过自定义UIView类来实现的。你需要创建一个新...

    GDI+ 面向对象 小画板

    总结起来,"面向对象的小画板"项目结合了GDI+图形绘制能力与面向对象编程思想,提供了用户友好的图形绘制界面。开发者通过创建各种图形类,实现了图形的绘制、填充和用户交互。这不仅锻炼了编程技能,也为其他开发者...

    ios画板小程序

    在iOS开发中,创建一个画板小程序涉及到许多关键知识点,主要集中在自定义视图和手势识别上。这个项目,名为“ios画板小程序”,显然旨在帮助开发者深入理解这些概念,并提供一个实现涂鸦效果的实践平台。让我们逐一...

    Flash图画板小软件

    这是一个Flash图画板小软件,有兴趣的童鞋可以看看哦

Global site tag (gtag.js) - Google Analytics