自己定义View  实现 五子棋

配图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG92ZV9KYXZjX3lvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG92ZV9KYXZjX3lvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG92ZV9KYXZjX3lvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

代码:

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

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

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

    利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的 ...

  2. android开发——自己定义相机(Camera)开发总结

    近期这段时间我一直在开发自己定义相机.谷歌了些网上的demo.发现有非常多各种各样的问题.终于还是从API的camera类開始学习,进行改进. 以下对之前的实现进行一些总结. 官方camera API ...

  3. 【Android】自己定义View

    翻译自:http://developer.android.com/training/custom-views/index.html 一)创建view类 一个设计良好的自己定义view与其它的类一样.它 ...

  4. Android开发进阶——自定义View的使用及其原理探索

    在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...

  5. Android 它们的定义View它BounceProgressBar

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/41246247 [Rocko's blog] 之前几天下载了非常久没用了的桌面版酷狗来用用的时候 ...

  6. Android 它们的定义View

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

  7. Android 它们的定义View (一)

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 非常Android入门程序员AndroidView.可能都是比較恐 ...

  8. Android 自定义View修炼-Android开发之自定义View开发及实例详解

    在开发Android应用的过程中,难免需要自定义View,其实自定义View不难,只要了解原理,实现起来就没有那么难. 其主要原理就是继承View,重写构造方法.onDraw,(onMeasure)等 ...

  9. Android 它们的定义View视图

    创建一个新视图将满足我们独特UI需求. 本文介绍的发展将指南针罗盘接口使用UI,通过继承View定义自己的视图类工具,为了深入了解自己的自定义视图. 实现效果图: 源码: 布局文件activity_m ...

随机推荐

  1. Ubuntu - 硬盘分区、格式化、自动挂载配置

    Ubuntu系统的硬盘空间不够用了,需要增加新的硬盘扩容.将硬盘分区.格式化.自动挂载配置的整个过程记下来,备忘. 运行环境 | Enviroment Ubuntu 10.10 一.硬盘分区 | Ha ...

  2. DESede对称加密算法工具类

    利用Cipher的核心功能,自己封装了一个加密解密的工具类,可以直接使用.在使用之前需要先下载commons-codec-1.9.jar,并导入项目. 工具类如下: package com.pcict ...

  3. CCControlExtension/CCControlButton

    #ifndef __CCCONTROL_BUTTON_H__ #define __CCCONTROL_BUTTON_H__ #include "CCControl.h" #incl ...

  4. phpmyadmin4.1.4安装配置教程

    phpMyAdmin 就是一种 MySQL 数据库的管理工具,安装该工具后,即可以通过 web 形式直接管理 MySQL 数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管 ...

  5. 【Javascript】如何实现点的wave效果 && sinewave效果

    参考资料: sinewave效果:http://www.oneapm.com/ci/docker.html?utm_source=BaiduPaid&utm_medium=cpc&ut ...

  6. g++ 静态库连接顺序的巨坑

    在编译最新版本(12.04)的alljoyn的chat示例的时候,想使用bundle daemon,依照在以前的经验修改文件:alljoyn-14.02.00-src/build/linux/x86_ ...

  7. idea下一次Jar包依赖问题的解决过程

    项目导入后有几个类显示没找到依赖类. 第一步,定位到该类所在的jar包:pom文件没有报错,所以这应该是一个jar包版本问题,通过import路劲大概确定了jar包,我本地这个jar包一共有两个版本, ...

  8. RxJava异步请求加载状态控制

    在我看来,RxJava最大的特点就是异步,无论你是解析复杂的数据或是IO操作,我们都可以利用它内置的线程池进行线程间的调度,简单的使用 subscribeOn(Schedulers.io()).doO ...

  9. 无比强大!Python抓取cssmoban站点的模版并下载

    Python实现抓取http://www.cssmoban.com/cssthemes站点的模版并下载 实现代码 # -*- coding: utf-8 -*- import urlparse imp ...

  10. 字符串在内存中的存储——C语言进阶

    字符串是以ASCII字符NUL结尾的字符序列. ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.只是,并不是全部的字符数组都是字符串,字符数组可能没有NUL字符. 字符数组 ...