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);

	}

}
时间: 2024-10-14 19:32:24

Android 开发 -------- 自己定义View 画 五子棋的相关文章

【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现

利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的橡皮擦就是白色的画笔,根本不用使用到画笔的setXfermode方法,要搞一堆复杂的project. 用户画完图之后能够保存图像.图像的文件名称是当前的时间.保存的位置是sdcard的根文件夹. 制作步骤例如以下: 1.先设置好字体文件res\values\strings.xml,主要是app的名称

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

【Android】自己定义View

翻译自:http://developer.android.com/training/custom-views/index.html 一)创建view类 一个设计良好的自己定义view与其它的类一样.它使用接口来封装一系列的功能.有效的使用CPU和内存等.除了这些,定制view还应该满足例如以下条件: 符合Android标准 与Android XML 布局文件配合,提供符合style风格的定制属性 发送易接近性事件(accessibility events,针对听力或视觉有缺陷用户提供方便的事件)

【Android】自己定义View、画布Canvas与画笔Paint

安卓自己定义View事实上非常easy. 这个View能够像<[Android]利用Java代码布局,button加入点击事件>(点击打开链接)一样.利用Java代码生成一系列的组件. 也能够配合画布Canvas与画笔Paint来使用. 以下用一个样例来说明.例如以下图,有一个自己定义布局View.里面摆放着,利用画布Canvas与画笔Paint绘制出来的蓝色正方形与红色文字. 在res\layout\activity_main.xml中.直接像摆放安卓固有组件一样,能够直接使用这个我定义组件

Android 它们的定义View

安卓开发过程,安卓官方控制有时来自往往不能满足我们的需求.这一次,我必须定义自己.下面我们就来看看他们的定义View: package com.example.myview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style;

Android 它们的定义View它BounceProgressBar

转载请注明出处:http://blog.csdn.net/bbld_/article/details/41246247 [Rocko's blog] 之前几天下载了非常久没用了的桌面版酷狗来用用的时候,发现当中载入歌曲的等待进度条的效果不错(个人感觉).例如以下: 然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目測要抄一节多课的一堆堆文字了啊...啊..)毅然决定把它鼓捣出来,终于的效果例如以下(总感觉有点不和谐啊·): 对照能看出来的就是多了形状的选择还有使用图片了.那么接下来就

Android开发之自定义View专题(三):自定义GridView

gridview作为android开发中常用的组件,其功能十分强大.但是,我们有时候有很多特殊的需求,需要在其基础上进行改造.有时候会有移动gridView中item位置的需求,这个网上已经有很多例子,博主就不在描述.今天博主讲的是移动gridView中item中的内容.博主没看过网上那些移动item位置的demo,不知道其原理是不是和博主想的一样.博主思考过,似乎博主的这种实现原理似乎也可以用作实现移动item位置.而之前博主百思不得其解的小米手机的桌面的自定义乱序排放,似乎也可以用这个原理去

Android开发之自定义View专题(二):自定义饼图

在图表里面,常用的图标一般为折线图.柱形图和饼图,上周,博主已经将柱形图分享.在博主的项目里面其实还用到了饼图,但没用到折线图.其实学会了其中一个,再去写其他的,应该都是知道该怎么写的,原理都是自己绘制图形,然后获取触摸位置判定点击事件.好了,废话不多说,直接上今天的饼图的效果图 这次也是博主从项目里面抽离出来的,这次的代码注释会比上次的柱形图更加的详细,更加便于有兴趣的朋友一起学习.图中的那个圆形指向箭头不属于饼图的部分,是在布局文件中为了美化另外添加进去的,有兴趣的朋友可以下载完整的项目下来

Android 它们的定义View视图

创建一个新视图将满足我们独特UI需求. 本文介绍的发展将指南针罗盘接口使用UI,通过继承View定义自己的视图类工具,为了深入了解自己的自定义视图. 实现效果图: 源码: 布局文件activity_main(当中CompassView继承View类): <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co