简介

最近Java学到了布局管理器,看到GridLayout就很有意思,老师说可以做Excel表格什么的,心中突发奇想,于是就想做一个波纹状按钮效果(事后一想可能是我键盘光效的影响-。-),网上一搜,虽然有这个名词,但是和我想的不太一样。于是开始着手去做。

实现流程

  1. 布局界面
  2. 找到被点击的按钮
  3. 以该按钮为起点进行BFS,搜层次,
  4. 按照层次进行多线程染色

涉及到点

布局管理,按钮数组,多线程,延时,BFS

实现代码

点击查看代码
package test;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;
import java.util.Queue; class MyLayout extends Frame implements ActionListener{ //按钮数组大小
private int ROWS = 10;
private int COLS = 10; class MyButton extends Button{
public int x,y;//按钮在数组中的下标
public int deep;//按钮的层次
} private MyButton btn[][] = new MyButton[ROWS][COLS];
private int vis[][] = new int[ROWS][COLS];
private Color a = new Color(252,157,154);//原始颜色
private Color b = new Color(254,67,101);//点击颜色
private int dir[][] = new int[][]{{0,1},{1,0},{0,-1},{-1,0}}; public MyLayout() {
//常规设置
this.setTitle("波纹按钮效果示意");
this.setSize(500, 500);
this.setLayout(new GridLayout(ROWS,COLS));//网格状布局
this.setResizable(false);//不可改变大小
//设置窗口在屏幕中央
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) screensize.getWidth() / 2 - this.getWidth() / 2;
int y = (int) screensize.getHeight() / 2 - this.getHeight() / 2;
this.setLocation(x, y);
//设置窗口可见
this.setVisible(true);
//使关闭窗口有效
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
MyLayout.this.dispose();
}
}); for(int i=0;i<ROWS;i++) {
for(int j=0;j<COLS;j++) {
btn[i][j] = new MyButton();
btn[i][j].setBackground(a);
btn[i][j].x = i;
btn[i][j].y = j;
btn[i][j].addActionListener(this);//注册监听
this.add(btn[i][j]);
}
}
} @Override
public void actionPerformed(ActionEvent e) {
//获取按钮数组中点击按钮下标
//通过坐标和长宽计算
MyButton bt = (MyButton)e.getSource();
int idx = bt.getY()/bt.getHeight();
int idy = bt.getX()/bt.getWidth();
goButton(idx, idy);
init();
} public void init(){
for(int i=0;i<ROWS;i++){
for(int j=0;j<COLS;j++){
vis[i][j] = 0; //未访问过
}
}
}
public void changeColor(int x,int y,Color preColor,Color nextColor,int time) {
//btn[x][y].setBackground(preColor);
//延时
new Thread() {
public void run() {
btn[x][y].setBackground(preColor);
try {
// System.out.println("延时!+"+time+"end");
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
btn[x][y].setBackground(nextColor);
try {
// System.out.println("延时!+"+time+"end");
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
btn[x][y].setBackground(preColor);
}
}.start();
} public void goButton(int idx,int idy) {
//BFS
Queue<MyButton> q = new LinkedList<MyButton>();
btn[idx][idy].deep = 0;//起始点第0层
q.offer(btn[idx][idy]);
vis[idx][idy] = 1;
// System.out.println(idx+","+idy+"被调用~");
while(!q.isEmpty()) {
MyButton head = q.poll();
for(int i=0;i<4;i++) {
int tx = head.x + dir[i][0];
int ty = head.y + dir[i][1];
if(judge(tx,ty)) {
btn[tx][ty].deep = head.deep + 1;
changeColor(tx,ty,a, b, btn[tx][ty].deep*50);
q.offer(btn[tx][ty]);
// System.out.println("改变颜色"+tx+','+ty+", deep:"+(head.deep+1));
}
}
}
// System.out.println("size" + q.size());
} public Boolean judge(int idx,int idy) {
if(idx<0||idx>=ROWS||idy<0||idy>=COLS) return false;
if(vis[idx][idy] == 1)return false; //用过了
vis[idx][idy] = 1;
return true;
} }
public class waterButton {
public static void main(String[] args) throws Exception {
/**
* 实现的效果
* 点击一个按钮,然后引发连锁反应变颜色,类似水的波纹
*/
MyLayout ml = new MyLayout();
} }

颜色搭配

搭配1:

原:R:252,G:157,B:154

后:R:254,G:67,B:101

搭配2:

原:R:200,G:200,B:169

后:R:131,G:175,B:155

实现效果

后记

好了,前面装成大佬的样子,现在还原成弱鸡的真实面目,其实我写demo的时候卡住了,无法进展的那种,所以我去请教sc大佬,大佬和我一起讨论,解决问题,感觉很好,最后实际上大佬写出的demo,而大佬的代码再加上一行代码就能实现这个效果。哈哈不过还是很高兴的, 70%成就感啦, 也很开心。

但是在我分享的过程中(弱鸡获得成就感的方式),结果发现,有一个people已经知道了,我很奇怪,追问下去,发现她的朋友psj大佬已经发给她过了,原来sc专业大佬和psj学习大佬,竟然很熟悉!

我不仅感慨

强者还是喜欢和强者一块玩。

想我这种弱鸡,还是需要努力奋斗的。

成就感50%

也很开心啦,是自己一点一点写出来的东西,谁还不心疼呢。

不过,今天还被sc大佬夸奖博客好看

100%成就感

【Java】按钮数组波纹效果的更多相关文章

  1. css3+jQuery实现按钮水波纹效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  2. Java按钮控件数组实现计算器界面

    编写程序,通过按钮数组来管理界面中的所有按钮控件,从而使用最少的代码实现模拟的计算器界面. 思路如下: 创建一个类,通过extends使其继承窗体类JFrame: 创建一个JFrame对象,使用JFr ...

  3. Android自定义组件系列【14】——Android5.0按钮波纹效果实现

    今天任老师发表了一篇关于Android5.0中按钮按下的波纹效果实现<Android L中水波纹点击效果的实现>,出于好奇我下载了源代码看了一下效果,正好手边有一个Nexus手机,我结合实 ...

  4. android自定义控件(4)-自定义水波纹效果

    一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ...

  5. Android自己定义控件系列五:自己定义绚丽水波纹效果

    尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...

  6. jquery ripples水波纹效果( 涟漪效果)

    这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ...

  7. 自定义view实现水波纹效果

    水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...

  8. Android 自定义view实现水波纹效果

    http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...

  9. canvas实现水波纹效果

    本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...

  10. android 按钮特效 波纹 Android button effects ripple

    android 按钮特效 波纹 Android button effects ripple 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E- ...

随机推荐

  1. c++的thread小测试

    windows环境还用不了thread,得下一些mingw,弄了半天没弄好,直接用了商店中心就有的Ubuntu了,但是sudo install g++出现了下载不了的问题,解决方案:https://b ...

  2. Linux & 标准C语言学习 <DAY9_1>

        2.函数传参:         1.函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用         2.实参与形参之间是以赋值的方式进行传递数据的,并且是单项值传递     ...

  3. 第一章C语言概述

    1.1程序实例 //first.程序 #include <stdio.h> int main() { int num; num = 1; printf("I am a simpl ...

  4. 用户地址管理---新增、设置默认地址、根据id查询所有地址、查询默认地址、查询指定用户的全部地址

    导入用户地址簿相关功能代码 需求分析: 地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息.同一个用户可以有多个地址信息,但是只能有一个默认地址. 用户的地址信息会存储在a ...

  5. hdfs的异构存储

    目录 1 背景 2 hdfs异构存储类型和存储策略 2.1 hdfs支持的存储类型 2.2 hdfs如何知道数据存储目录是那种存储类型 2.3 存储策略 2.3.1 在hdfs中支持如下存储策略 2. ...

  6. 【算法总结】强化学习部分基础算法总结(Q-learning DQN PG AC DDPG TD3)

    总结回顾一下近期学习的RL算法,并给部分实现算法整理了流程图.贴了代码. 1. value-based 基于价值的算法 基于价值算法是通过对agent所属的environment的状态或者状态动作对进 ...

  7. 逍遥自在学C语言 位运算符 "|" 的5种高级用法

    前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是 ...

  8. handler+looper+messagequeue源码解析

    https://www.jianshu.com/p/b4d745c7ff7ahandler机制源码1.handler机制的作用在多线程的场景中,将子线程中需要更新UI的操作信息传递到UI主线程.多个线 ...

  9. DG:重启之后主备数据重新同步

    问题描述:本来配置好的DG第二天重启之后,发现主备库数据不能同步,在主库上执行日志切换以及创建表操作都传不到备库上,造成这种错误的原因是主库实例断掉后造成备库日志与主库无法实时接收 主库:orcl  ...

  10. ROS机器人校正

    vROS机器人IMU自动校正 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 自动 ...