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 ...
随机推荐
- Vmware 14.0 版本中安装Ubuntu 17.10版本无法调整分辨率的问题
装完ubuntu后发现在vmware中选择了查看-自动调整大小-自适应客户机,虚拟机也无法随着窗口大小来切换分辨率,其实是因为WAYLAND限制了. 1. 先安装vim sudo apt-get in ...
- Android打印机--小票打印格式及模板设置
小票打印就是向打印设备发送控制打印格式的指令集,而这些打印格式须要去查询相应打印机的API文档,这里我把经常使用的api给封装了一下 文字对齐方式 打印字体大小 字体是否加粗 打印二维码 打印条形码 ...
- JS 数字左补零函数
/* 左边自动补零 质朴长存法 by lifesinger */ function pad(num, n) { var len = num.toString().length; while(len & ...
- android不同机型上界面适配问题
android中长度有:dp(或者dip device independent pixels)一种基于屏幕密度的抽象单位.在每英寸160点的显示器上.1dp=1px. 不同设备有不同的显示效果.这个和 ...
- Linux命令之编辑
vi是终端命令行里功能最强的文本编辑器了,但眼下须要用到的仅仅是文本编辑功能.与GCC.make等工具的整合应用如今还不须要,所以操作难度不大,习惯就好. Linux发行版所带的一般不是vi,而是vi ...
- Android常用传感器用法一览(3)
Android 开发包标准有8个传感器: Sensor.TYPE_ACCELEROMETER o 加速度计 (X, Y, Z) m/s2 Sensor.TYPE_GYROSCOPE o 陀螺仪 (X, ...
- vue - v-text 和 v-html
1.官方有了{{data}}绑定数据了,为啥还要v-text 因为网络问题,可以我们会卡到看“{{}}”,很尴尬吧!!! => 因此推荐用v-text 2. v-html是啥? 能吃吗 , v- ...
- vue - webpack.dev.conf.js
描述:开发时的配置.(配置开发时的一些操作) 例如这里,是否自动打开浏览器(默认true) 'use strict' // build/util.js const utils = require('. ...
- Python多线程问题的资料查找与汇总
Python多线程问题的资料查找与汇总 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpea ...
- GUID转换成16位字符串或19位唯一字符串
整理几个经常使用GUID转换成16位字符串或19位唯一字符串方法: /// <summary> /// 依据GUID获取16位的唯一字符串 /// Author : 付义方 /// < ...