欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android触摸事件小小画板(7)

程序员文章站 2022-03-17 19:18:23
...

     补下上节课的章节,键盘事件,OnKeyListener实例实现一个输入框判断是否是email地址,是的话换图片为对勾:

public class MainActivity extends Activity {

	private EditText edit=null;
	private ImageView image=null;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.edit=(EditText)super.findViewById(R.id.edit);
		this.image=(ImageView)super.findViewById(R.id.image);
		this.edit.setOnKeyListener(new keychange());
	}
	private class keychange implements OnKeyListener{

		@Override
		public boolean onKey(View v, int keycode, KeyEvent event) {
			MainActivity.this.image.setImageResource(R.drawable.right);
			switch(event.getAction()){
			case KeyEvent.ACTION_UP:
				String meg=MainActivity.this.edit.getText().toString();
				if(meg.matches("\\w+@\\w+\\.\\w+")){
				MainActivity.this.image.setImageResource(R.drawable.right);
				}
				else{
					MainActivity.this.image.setImageResource(R.drawable.wrong);
				}
			case KeyEvent.ACTION_DOWN:
			default: break;
					
					
			}
			return false;
		}
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

          这里要准备两张图,对图和错图,默认错图   实现效果为:

 

          
Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 


Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 
 
             

 

 

 

 

 

Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 Android中的触摸事件可是大头中的大头,我们这一节课是要实现一个小小绘图板

其中onTouch事件是在view中定义的,所以想要实现绘图,自己要定义一个绘图组件,这个组件一定要继承view类,同时覆盖重写view中的onDraw方法。

Android画图最基本的三个对象(Color,Paint,Canvas)

三个类都存放在 android.graphics包下

1) Color :颜色对象,相当于现实生活中的 ‘调料’

2) Paint : 画笔对象,相当于现实生活中画图用的 ‘笔’————主要的还是对‘画笔’进行设置

3) Canvas : 画布对象,相当于现实生活中画图用的 ‘纸 或 布’

 
public class paintview extends View{
	private List<Point> pointall=new ArrayList<Point>();
	
	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){    //当按下
				pointall=new ArrayList<Point>();
				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();	//不停下指
				canvas.drawLine(first.x, first.y, last.x, last.y,p);	
					
				}
			}
		}
	}

	
}
 

 

 

然后在配置文件配置你的组件

 <com.example.paint.paintview
        android:id="@+id/paintview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

 

这里我们突兀发现了一个新名词:Iterator 迭代器,为什么要使用迭代器?

那我们来看看不用迭代器的后果

迭代模式是访问集合类的通用方法,只要集合类实现了Iterator接口,就可以用迭代的方式来访问集合类内部的数据,Iterator访问方式把对不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。 
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引: 

 

Ruby代码 
  1. for(int i=0; i<array.length; i++) { ... get(i) ... }   


   这种方法的缺点就是事先必须知道集合的数据结构,而且当我换了一种集合的话代码不可重用,要修改,比如我用set,就不能通过索引来遍历了。访问代码和集合是紧耦合,无法将访问逻辑从集合类和客户端代码中剥离出来,每一种集合类对应一种访问方式,代码不可重用。 
   为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合。 
   每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree 可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个 Iterator接口即可,这就是面向对象的威力。 

这就是针对抽象编程的原则:对具体类的依赖性最小。

 

 

还有Point:

 

 

这个类从字面意思就可以看出它跟点有关系,是点的一个对象类。 

这个类有两个属性,分别是:X坐标和y坐标。 

构造函数有三个:Point(),Point(int x,int y),Point(Point p) 

我们来看下运行效果:

 

 Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 

 

 

 

 

 

 

 

 

 

 

 

  • Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 
  • 大小: 18.1 KB
  • Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 
  • 大小: 27.5 KB
  • Android触摸事件小小画板(7)
            
    
    博客分类: Android初步 安卓触摸画图事件 
  • 大小: 35.5 KB