zoukankan      html  css  js  c++  java
  • Android 开发 -------- 自己定义View 画 五子棋


    自己定义View  实现 五子棋 


    配图:




    代码:

    package com.example.fiveson;
    
    import java.util.LinkedList;
    import java.util.List;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class FiveSon extends View {
    
    	public FiveSon(Context context) {
    		super(context);
    		// TODO Auto-generated constructor stub
    		init(context, null);
    	}
    
    	public FiveSon(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		// TODO Auto-generated constructor stub
    		init(context, attrs);
    	}
    
    	public FiveSon(Context context, AttributeSet attrs, int defStyleAttr) {
    		super(context, attrs, defStyleAttr);
    		// TODO Auto-generated constructor stub
    		init(context, attrs);
    	}
    	
    	private Paint paint = new Paint();
    	private Paint circlePaint = new Paint();
    	
    	// 旗子: 信息  代表 第几行 第几列?
    	private List<int[]> chesses = new LinkedList<int[]>();
    	
    	private void init(Context context, AttributeSet attrs)
    	{
    		chesses.add(new int[]{3,5});
    		chesses.add(new int[]{3,6});
    	}
    	
    	
    	int spacing = 100;
    	
    	
    	@Override
    	protected void onDraw(Canvas canvas) {
    		// TODO Auto-generated method stub
    		super.onDraw(canvas);
    		
    		int width = getWidth();
    		int height = getHeight();
    		
    		
    		//1 绘制 X 坐标
    		
    		int num = width / spacing;
    		
    		paint.setColor(Color.BLACK);
    		for(int i=0;i<=num;i++)
    		{
    			canvas.drawLine(spacing*i, 0, spacing*i, height, paint);
    		}
    		
    		num = height/spacing;
    		
    		for(int i=0;i<=num;i++)
    		{
    			canvas.drawLine(0,spacing*i, width,spacing*i, paint);
    		}
    		
    		//2 绘制Y 坐标
    		
    		
    		
    		//3 绘制 旗子
    		
    		if(!chesses.isEmpty())
    		{
    			
    			int count = chesses.size();
    			
    			for(int i=0;i<count;i++)
    			{
    				// 行列 信息
    				int[] location = chesses.get(i);
    				
    				int rawX = location[1] * spacing;
    				int rawY = location[0] * spacing;
    				
    				if(i%2==0)
    				{
    					circlePaint.setColor(Color.BLACK);
    				}else {
    					circlePaint.setColor(Color.GREEN);
    				}
    				
    				canvas.drawCircle(rawX, rawY, 20, circlePaint);
    			}
    			
    		}
    	}
    	
    	
    	/**
    	 * 全然自己定义空间:
    	 * 
    	 * 处理你恶不处理时间爱你的方法:
    	 * onTouchEvent()
    	 * onKeyEvent()
    	 * 
    	 * 当然 也能够通过 
    	 * setOnTouchListener()
    	 * setOnKeyListener();
    	 * 
    	 * 外部操作:
    	 * setOnTouchListener(OnTouchListener l) 
    	 * setOnKeyListener(OnKeyListener l) 
    	 * 
    	 * 
    	 * 
    	 * */
    	
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    		
    		boolean isComsumed = false;
    		
    		int action = event.getAction();
    		
    		if(action == MotionEvent.ACTION_DOWN)
    		{
    //			分析点击的坐标 来推断 点击的 行数和 列数
    			
    			int ex =  (int)event.getX();
    			int ey =  (int)event.getY();
    			
    			int colNum = (int)(ex / spacing);
    			int rowNum = (int)(ey / spacing);
    			
    			int  colcc = ex % spacing;
    			int  rowcc = ey % spacing;
    			
    			if(colcc>=(spacing/2))
    			{
    				colcc++;
    			}
    			if(rowcc>=(spacing/2))
    			{
    				rowcc++;
    			}
    			
    //			推断什么时候add 
    			int len = chesses.size();
    			
    			if(len>0)
    			{
    				boolean has = false;
    				for(int i = len-1;i>=0;i--)
    				{
    					int[] chs = chesses.get(i);
    					if(rowNum == chs[0] && colNum == chs[1])
    					{
    						has = true;
    						break;
    					}
    				}
    				if(!has)
    				{
    					chesses.add(new int[]{rowNum,colNum});
    					invalidate();
    				}
    
    			}else {
    				chesses.add(new int[]{rowNum,colNum});
    				invalidate();
    			}
    			
    			isComsumed = true;
    			
    		}else {
    			isComsumed = super.onTouchEvent(event);
    		}
    		
    		return super.onTouchEvent(event);
    		
    	}
    	
    }
    


  • 相关阅读:
    组织机构数据隔离(上级可看下级,同级屏蔽)的高效实现思路
    .NET Core 3.x 基于AspectCore实现AOP,实现事务、缓存拦截器
    .NET Core 3.x 基于Autofac的AOP缓存
    Web开发中【密码加密】详解
    python多线程 DBUtils操作数据库
    处理MariaDB Galera cluster初始化和启动报错两例
    搭建MariaDB Galera Cluster集群 10.3.8
    AzureWeb应用作为客户端携带证书访问其他链接办法
    CTF
    [KuangBin专题四]Silver Cow Party
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6745197.html
Copyright © 2011-2022 走看看