Android 开发 -------- 自己定义View 画 五子棋
自己定义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 画 五子棋的更多相关文章
- 【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现
利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的 ...
- android开发——自己定义相机(Camera)开发总结
近期这段时间我一直在开发自己定义相机.谷歌了些网上的demo.发现有非常多各种各样的问题.终于还是从API的camera类開始学习,进行改进. 以下对之前的实现进行一些总结. 官方camera API ...
- 【Android】自己定义View
翻译自:http://developer.android.com/training/custom-views/index.html 一)创建view类 一个设计良好的自己定义view与其它的类一样.它 ...
- Android开发进阶——自定义View的使用及其原理探索
在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...
- Android 它们的定义View它BounceProgressBar
转载请注明出处:http://blog.csdn.net/bbld_/article/details/41246247 [Rocko's blog] 之前几天下载了非常久没用了的桌面版酷狗来用用的时候 ...
- Android 它们的定义View
安卓开发过程,安卓官方控制有时来自往往不能满足我们的需求.这一次,我必须定义自己.下面我们就来看看他们的定义View: package com.example.myview; import andro ...
- Android 它们的定义View (一)
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 非常Android入门程序员AndroidView.可能都是比較恐 ...
- Android 自定义View修炼-Android开发之自定义View开发及实例详解
在开发Android应用的过程中,难免需要自定义View,其实自定义View不难,只要了解原理,实现起来就没有那么难. 其主要原理就是继承View,重写构造方法.onDraw,(onMeasure)等 ...
- Android 它们的定义View视图
创建一个新视图将满足我们独特UI需求. 本文介绍的发展将指南针罗盘接口使用UI,通过继承View定义自己的视图类工具,为了深入了解自己的自定义视图. 实现效果图: 源码: 布局文件activity_m ...
随机推荐
- 谷歌扩展程序--------------Message
转载:https://developer.chrome.com/extensions/messaging#external-webpage Message Passing Since content ...
- 流畅的python第十章序列的修改,散列和切片学习记录
只要实现了__len__和__getitem__两个方法即可将该类视为序列. 切片原理 动态存取属性 如果实现了__getattr__方法,也要定义__setattr__方法,以防对象行为不一致
- unity stuck when building
卡在 packaging assets 这里的话 把文件夹只读属性去掉 应用于子文件夹
- .NET/MVC-ViewBag、ViewData、TempData区别
1.ViewData ViewData的生命周期和View相同, 只对当前View有效. 2.TempData TempData保存在Session中, Controller每次执行请求的时候会从Se ...
- APNS .p12文件转换为 .pem文件
1:先用mac的钥匙串工具,把APN的推送证书转换为 .p12文件: 2:在mac的终端下 把.p12文件转换为 .pem文件 openssl pkcs12 -in apns-dev-cert.p12 ...
- python的基本知识点
一.数据类型 1.整数2.浮点数3.字符串4.布尔值:True/False5.空值:None 二.变量 变量名必须是大小写英文.数字和_的组合,且不能以数字开头 三.常量 全部大写的变量名表示常量,p ...
- 一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置
代码地址如下:http://www.demodashi.com/demo/11271.html 一.准备工作 准备一台安卓设备手机,4.4以上版本 本例子实现,一个可变布局列表,有9种布局item大小 ...
- UVALive 6529 Eleven 区间dp
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4540">点击打开链接 题意: ...
- bootstrap 学习笔记 轮播(Carousel)插件
Bootstrap轮播(carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除些之外,内容也是足够灵活的,可以是图像,内嵌框架,视频或者其他您想要旋转的任何类型的内容. 示例: 下面是不念 ...
- 《将一个字符串转换成datetime时,先分析该字符串以获取日期,然后再将每个变量放置到datetime对象中》的解决办法
我们在写代码时,稍不注意就收到VS那文不对题的错误提示. 最近在项目上碰到了“将一个字符串转换成datetime时,先分析该字符串以获取日期,然后再将每个变量放置到datetime对象中”的这个错误提 ...