该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html

一、知识点讲解

当我们点击系统自带的按钮时,按钮的外观会发生变化。上篇博文中我们画了一个三角形按钮,但点击还不能变色,下面我们就来实现点击变色功能。

从知识体系上我们需要了解以下两个知识点

  • 1.如何知道手指点击了我们的控件?

办法是重写View中的onTouchEvent方法。当手指触摸到我们的控件时,系统会通过该方法告诉我们。该方法还有一个类型为MotionEvent的参数,通过该参数我们就能知道当前触摸事件的具体类型,比如按下、移动、抬起等。
我们可以让按钮在正常情况下显示一个较暗的颜色,按下时显示一个较亮的颜色,抬起后再恢复到较暗的颜色。这样就实现了点击变色的效果了。

  • 2.如何变色?

View中提供了一个叫invalidate的方法,每次调用该方法,系统都会重新调用onDraw方法来重绘本控件。我们要做的就是在onDraw中判断当前的触摸动作,如果是按下就画一个高亮的三角形,没有触摸或按下抬起后就画一个较暗的三角形。

了解了相关的知识点,下面我们就通过代码来实现。

二、代码实现

以下是当前DirectionKeys类的全部代码:

  1. package net.chengyujia.happysnake;
  2.  
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.Paint;
  6. import android.graphics.Path;
  7. import android.util.AttributeSet;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10.  
  11. /**
  12. * Created by ChengYuJia on 2016/8/19.
  13. * 屏幕上的虚拟方向键
  14. */
  15. public class DirectionKeys extends View {
  16. //左三角形按压时的颜色(较亮)
  17. private int leftPressedColor = 0xFFFF0000;
  18. //左三角形正常显示的颜色(较暗)
  19. private int leftNormalColor = 0xFFAA0000;
  20. //手触摸屏幕的动作,初始值用一个MotionEvent中没有用到的action值,比如-10,表示还没有任何触屏动作发生。
  21. private int action = -10;
  22. //画布的宽
  23. private int width;
  24. //画布的高
  25. private int height;
  26. //画左三角形的路径
  27. private Path pathLeft = new Path();
  28. //画笔
  29. private Paint paint = new Paint();
  30. //初始化方法是否执行过,确保初始化方法只执行一次。
  31. private boolean initDone = false;
  32.  
  33. //只有一个参数的构造方法是我们在程序中通过“new”关键字创建实例时调用。
  34. public DirectionKeys(Context context) {
  35. super(context);
  36. }
  37.  
  38. //有两个参数的构造方法是系统在XML布局文件中创建实例时调用。
  39. public DirectionKeys(Context context, AttributeSet attrs) {
  40. super(context, attrs);
  41. }
  42.  
  43. //初始化方法
  44. private void init(Canvas canvas) {
  45. /*获取画布的长和宽*/
  46. width = canvas.getWidth();
  47. height = canvas.getHeight();
  48. /*
  49. (小提示:在计算机中一般都是将左上角作为坐标原点的)
  50. 画布上四个顶点和中心点的坐标如下:
  51. 左上点 0,0
  52. 左下点 0,height
  53. 右上点 width,0
  54. 右下点 width,height
  55. 中心点 width/2,height/2
  56. */
  57.  
  58. /*设置左三角形的路径数据*/
  59. //从画布左上点开始
  60. pathLeft.moveTo(0, 0);
  61. //画直线到画布中心点
  62. pathLeft.lineTo(width / 2, height / 2);
  63. //再画直线到画布左下点
  64. pathLeft.lineTo(0, height);
  65. //自动闭合图形。从最后一个点(左下点)画直线到第一个点(左上点)。
  66. pathLeft.close();
  67. }
  68.  
  69. /**
  70. * 通过重写父类的onDraw方法来绘制我们需要的图形
  71. * 该方法会在控件第一次显示时被系统调用,并在之后每次调用invalidate方法后被系统调用。
  72. *
  73. * @param canvas 这里的canvas是系统提供的一块矩形画布,我们要做的就是在这块画布上画我们想要的东西。
  74. */
  75. @Override
  76. protected void onDraw(Canvas canvas) {
  77. if (!initDone) {
  78. init(canvas);
  79. //确保初始化方法只执行一次
  80. initDone = true;
  81. }
  82.  
  83. if (action == MotionEvent.ACTION_DOWN) {
  84. //手按压时高亮显示
  85. paint.setColor(leftPressedColor);
  86. } else {
  87. //没有按或按下抬起后显示较暗的颜色
  88. paint.setColor(leftNormalColor);
  89. }
  90. //画左三角形
  91. canvas.drawPath(pathLeft, paint);
  92. }
  93.  
  94. /**
  95. * 如果手触摸到我们的控件,系统会通过该方法告诉我们
  96. *
  97. * @param event 系统给我们传递的触摸事件参数
  98. * @return 如果该触摸事件被我们处理了返回true,反之返回false。
  99. */
  100. @Override
  101. public boolean onTouchEvent(MotionEvent event) {
  102. action = event.getAction();
  103. //ACTION_DOWN表示手按到屏幕,ACTION_UP表示手从屏幕上抬起。我们只处理这两种动作。
  104. if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
  105. //invalidate方法是告诉系统当前控件需要重绘,系统会再次调用onDraw方法来实现重绘。
  106. invalidate();
  107. return true;
  108. }
  109. return false;
  110. }
  111. }

上面注释比较详细,主要就3个方法onDraw(绘图)、onTouchEvent(监听触摸事件)、invalidate(让系统调用onDraw方法实现重绘)。

另外Path对象和Paint对象只要初始化一次就可以了,没必要每次onDraw的时候重新创建,提高程序性能。

三、运行效果

正常时显示暗色:

按下时显示亮色:

测试的时候会发现,点击非三角形区域也会变色,这因为我们还没有对点击的位置做判断,这个会在后面讲解。

先到这里,下文继续。:)

Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...

  2. Android快乐贪吃蛇游戏实战项目开发教程-02虚拟方向键(一)自定义控件概述

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.自定义控件简介 在本项目中,无论是游戏主区域还是虚拟方向键都是通过自定义控件 ...

  3. Android快乐贪吃蛇游戏实战项目开发教程-06虚拟方向键(五)绘制方向键箭头

    本系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html本系列教程项目源码GitHub地址:https://github.com/jack ...

  4. Android快乐贪吃蛇游戏实战项目开发教程-03虚拟方向键(二)绘制一个三角形

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.绘制三角形 在上一篇文章中,我们已经新建了虚拟方向键的自定义控件Direct ...

  5. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  6. 原生Js贪吃蛇游戏实战开发笔记

    前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...

  7. Android实现贪吃蛇游戏

    [绥江一百]http://www.sj100.net                                                  欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...

  8. 【C语言项目】贪吃蛇游戏(上)

    目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) 3.5 欢迎界面函 ...

  9. 使用Love2D引擎开发贪吃蛇游戏

    今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...

随机推荐

  1. SQL Server相关书籍

    SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  4. zookeeper源码分析之二客户端启动

    ZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API: create(path, data, flags): 创建一个ZNode, path是其 ...

  5. MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  6. 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程

    最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...

  7. T-SQL学习记录

    T-sql是对SQL(structure query language )的升级.可以加函数. 系统数据库:master管理数据库.model模版数据库,msdb备份等操作需要用到的数据库,tempd ...

  8. 怎样两个月完成Udacity Data Analyst Nanodegree

    在迷恋数据科学很久后,我决定要在MOOC网站上拿到一份Data Science的证书.美国三个MOOC网站,Udacity上的课程已经被分成了数个nanodegree,每个nanodegree都是目前 ...

  9. 打开程序总是会提示“Enter password to unlock your login keyring” ,如何成功关掉?

    p { margin-bottom: 0.1in; line-height: 120% } 一.一开始我是按照网友所说的 : rm -f ~/.gnome2/keyrings/login.keyrin ...

  10. UGUI Text(Label)

    环境 Unity 5.3.6f1 关于Best Fit 如果勾选了 Best Fit ,当有大量的文本填充在Text上时,那么文字是不会自动换行的. 打字机效果 在github上已有现成的:https ...