這個比較簡單,沒啥東西,就是每列開始行的選擇,有點繞彎,我就注釋下GraphicsPanel吧,主要的繪制工作都在這個類里面
創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元叢臺做網(wǎng)站,已為上家服務(wù),為叢臺各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
private?class?GraphicsPanel?extends?JPanel?{
public?void?paint(Graphics?g)?{
Graphics2D?g2d?=?(Graphics2D)?g;
g2d.?setFont?(getFont?().?deriveFont?(Font.?BOLD));
g2d.?setColor(Color.?BLACK);
g2d.?fillRect?(0,?0,?screenSize.?width,?screenSize.?height);???//?設(shè)置背景色為黑色
int?currentColumn?=?0;
for?(int?x?=?0;?x??screenSize.width;?x?+=?gap)?{
int?endPos?=?posArr[currentColumn];??????//獲得開始行位置
g2d.?setColor(Color.?GREEN);
g2d.drawString(String.valueOf(getChr()),?x,?endPos?*?gap);?????//畫出隨機開始行的字符
int?cg?=?0;???????????????????????????????????????????????????????????//初始黑色
for?(int?j?=?endPos?-16;?j??endPos;?j++)?{???????????//隨機行逐列向上16行,為循環(huán)開始行
cg?+=?15;?????????????????????????????????????????????????????//漸變色15遞增,255為green
if?(cg??255)?{
cg?=?255;
}
g2d.setColor(new?Color(0,?cg,?0));
g2d.drawString(String.valueOf(getChr()),?x,?j?*?gap);????//畫出隨機行后的15行字符,顏色從黑色漸變成綠色,逐行增加
}
posArr[currentColumn]?+=?random.nextInt(5);??????//下落距離最快為4
if?(posArr[currentColumn]?*?gap??getHeight())?{??//如果行數(shù)位置大于屏幕高度,從新獲取合適的行
posArr[currentColumn]?=?random.nextInt(lines);
}
currentColumn++;????//下一列獲取隨機行
}
用定時器不行么?
順便寫了個,參考而已
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.Timer;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class TestA extends JFrame implements ActionListener {
//-----要實現(xiàn)ActionListener接口
public Timer t;
public JButton jb;
//-----一個定時器一個按鈕用來顯示變色效果
public int red = 0;
public int green = 0;
public int blue = 0;
public TestA() {
jb = new JButton("test");
jb.setBackground(Color.BLUE);
//-----定時器設(shè)置為0.2秒觸發(fā)1次事件
t = new Timer(200, this);
this.setSize(200, 200);
this.getContentPane().add(jb);
this.setVisible(true);
//-----定時器開始運行
this.t.start();
}
public void actionPerformed(ActionEvent e) {
red += 5;
green += 10;
blue += 15;
red %= 255;
green %= 255;
blue %= 255;
//-----三種顏色按你所需搞個漸變的規(guī)則
this.jb.setBackground(new Color(red, green, blue));
this.jb.setVisible(true);
}
public static void main(String[] _s) {
TestA a = new TestA();
}
}
給你需要變色的元件掛個定時器。
您好,現(xiàn)給你一個簡單MFC對話框例子,工程名為TEXT:
(1)Text.h:
class CTextApp : public CWinApp
{
public:
CTextApp();
~CTextApp();
// 重寫
public:
virtual BOOL InitInstance();
ULONG_PTR gdiplusToken;
// 實現(xiàn)
DECLARE_MESSAGE_MAP()
};
extern CTextApp theApp;
注:ULONG_PTR gdiplusToken; ~CTextApp(); 為新添加的東西
(2)Text.cpp里
CTextApp::~CTextApp()
{
//GDI+釋放
GdiplusShutdown(gdiplusToken);
}
BOOL CTextApp::InitInstance()
{
// 如果一個運行在 Windows XP 上的應(yīng)用程序清單指定要
// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,
//則需要 InitCommonControlsEx()。否則,將無法創(chuàng)建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 將它設(shè)置為包括所有要在應(yīng)用程序中使用的
// 公共控件類。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(InitCtrls);
CWinApp::InitInstance();
//GDI+初始化
GdiplusStartupInput StartupInput;
GdiplusStartup(gdiplusToken, StartupInput, NULL);
AfxEnableControlContainer();
// 創(chuàng)建 shell 管理器,以防對話框包含
// 任何 shell 樹視圖控件或 shell 列表視圖控件。
CShellManager *pShellManager = new CShellManager;
// 標準初始化
// 如果未使用這些功能并希望減小
// 最終可執(zhí)行文件的大小,則應(yīng)移除下列
// 不需要的特定初始化例程
// 更改用于存儲設(shè)置的注冊表項
// TODO: 應(yīng)適當修改該字符串,
// 例如修改為公司或組織名
SetRegistryKey(_T("應(yīng)用程序向?qū)傻谋镜貞?yīng)用程序"));
CTextDlg dlg;
m_pMainWnd = dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置處理何時用
// “確定”來關(guān)閉對話框的代碼
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置處理何時用
// “取消”來關(guān)閉對話框的代碼
}
// 刪除上面創(chuàng)建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
// 由于對話框已關(guān)閉,所以將返回 FALSE 以便退出應(yīng)用程序,
// 而不是啟動應(yīng)用程序的消息泵。
return FALSE;
}
注:GdiplusStartupInput StartupInput; GdiplusStartup(gdiplusToken, StartupInput, NULL);為新添加的東西
(3)stdafx.h
//GDI+
#includegdiplus.h
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
注:以上為為新添加的東西,需要的頭文件就是上而這些
(4)接著你就可以使用LinearGradientBrush, 在TextDlg.cpp
void CTextDlg::OnPaint()
{
Graphics graphics(this-m_hWnd);
LinearGradientBrush linGrBrush(
Point(0,0),
Point(200,0),
Color(255,255,0,0),
Color(255,0,0,255));
graphics.FillRectangle(linGrBrush, 0, 0, 200, 200);
}
至少有兩種方案可以實現(xiàn):
第一是使用背景圖片,就是給Linearlayout添加一個background屬性,值選擇一張帶漸變顏色的圖片即可。
第二種方案是使用獨立的顏色代碼來替代上述一種的背景圖片,比如可以在res/drawable下新建一個mycolor.xml,然后再在LinearLayout添加屬性
android:background="@drawable/mycolor"即可
?xml?version="1.0"?encoding="utf-8"?
shape?xmlns:android="
gradient
android:angle="270"
android:centerColor="#00FFFF"
android:centerX="0.5"
android:centerY="0。3"
android:endColor="#666666"
android:startColor="#0099FF"?/
padding
android:bottom="7dp"
android:left="7dp"
android:right="7dp"
android:top="7dp"?/
corners?android:radius="4dp"?/
/shape
解析:其中android:angle ="270.0"代表角度為270,由上到下的漸變,如果我改變成0那么就變成了從左到右的漸變,如果改變90.0那么漸變會從下邊往上漸變,可以 多改變一下參數(shù)試試效果。centerColor中間顏色; centerX: x軸漸變中心,從左到右漸變時有意義;centerY: 同理y軸的漸變中心;endColor 漸變終點顏色,同樣startColor為漸變起點顏色。
上述代碼效果如下:
import?java.awt.Canvas;
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.Graphics;
import?java.awt.Image;
import?java.util.Random;
import?javax.swing.JFrame;
class?RainCanvas?extends?Canvas?implements?Runnable{
private?int?width,?height;
private?Image?offScreen;?//?緩沖圖片
private?char[][]?charset;?//?隨機字符集合
private?int[]?pos;?//?列的起始位置
private?Color[]?colors?=?new?Color[25];?//?列的漸變顏色
public?RainCanvas(int?width,?int?height)?{
this.width?=?width;
this.height?=?height;
//?生成ASCII可見字符集合
//創(chuàng)建一個新的隨機器
Random?rand?=?new?Random();
?//width/10為字符雨屏幕的寬度??height/10為字符雨屏幕的長度
//隨機字符數(shù)組
charset?=?new?char[width?/?10][height?/?10];
for?(int?i?=?0;?i??charset.length;?i++)?{
for?(int?j?=?0;?j??charset[i].length;?j++)?{
//nextInt(int?n)?返回一個偽隨機數(shù),它是從此隨機數(shù)生成器的序列中取出的、在?0(包括)和指定值(不包括)之間均勻分布的?int值。
//48--144代表鍵盤上的字母?符號?數(shù)字
//為charset數(shù)組的每個元素取值
charset[i][j]?=?(char)?(rand.nextInt(96)?+?48);?}
}
//?隨機化列起始位置
pos?=?new?int[charset.length];
for?(int?i?=?0;?i??pos.length;?i++)?{
pos[i]?=?rand.nextInt(pos.length);
}
//?生成從黑色到綠色的漸變顏色,最后一個保持為白色
for?(int?i?=?0;?i??colors.length?-?1;?i++)?{
//顏色漸變
colors[i]?=?new?Color(0,?255?/?colors.length?*?(i?+?1),?0);?}
//設(shè)置最底下一個的字符的顏色????0?0?255?藍色??255?0?0?紅色??255?255?255?白色??0?255?0?綠色
colors[colors.length?-?1]?=?new?Color(0,?0,?255);?
setBackground(Color.black);
setSize(width,?height);
setVisible(true);
}
public?void?startRain()?{
new?Thread(this).start();
}
public?void?drawRain()?{
if?(offScreen?==?null)?{
return;
}
// Random?rand?=?new?Random();
//getGraphice()創(chuàng)建供繪制閉屏圖像使用的圖形上下文
Graphics?g?=?offScreen.getGraphics();
//通過使用當前繪圖表面的背景色進行填充來清除指定的矩形。
g.clearRect(0,?0,?width,?height);
//將此圖形上下文的字體設(shè)置為指定字體。使用此圖形上下文的所有后續(xù)文本操作均使用此字體。
g.setFont(new?Font("Arial",?Font.PLAIN,?14));
//
for?(int?i?=?0;?i??charset.length;?i++)?{
//int?speed?=?rand.nextInt(3);
for?(int?j?=?0;?j??colors.length;?j++)?{
//去掉j只顯示藍色的一個字符??去掉charset[i].length顯示黑屏
int?index?=?(pos[i]?+?j)?%?charset[i].length;
//?將此圖形上下文的當前顏色設(shè)置為指定顏色。
g.setColor(colors[j]);
//使用此圖形上下文的當前字體和顏色繪制由指定字符數(shù)組給定的文本
g.drawChars(charset[i],?index,?1,?i?*?10,?index?*?10);
}
pos[i]?=?(pos[i]+2?)?%?charset[i].length;
}
}
@Override
public?void?update(Graphics?g)?{
paint(g);
}
public?void?run()?{
while?(true)?{
drawRain();
repaint();
try?{
Thread.sleep(50);?//?可改變睡眠時間以調(diào)節(jié)速度
}
catch?(InterruptedException?e)?{
System.out.println(e);
}
}
}
@Override
public?void?paint(Graphics?g)?{
//?當組件顯示時檢測是否要創(chuàng)建緩沖圖片,在組件還不可見時調(diào)用createImage將返回null
if?(offScreen?==?null)?{
offScreen?=?createImage(width,?height);
}
g.drawImage(offScreen,?0,?0,?this);
}
}
public?class?ZFYTest?extends?JFrame{
private?RainCanvas?canvas?=?new?RainCanvas(1366,?768);
public?ZFYTest()?{
super("ZFY");
setUndecorated(true);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
canvas?=?new?RainCanvas(this.getWidth(),?this.getHeight());?//canvas?=?new?RainCanvas(800,600);
getContentPane().add(canvas);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public?static?void?main(String[]?args)?{
ZFYTest?test?=?new?ZFYTest();
test.canvas.startRain();
}
}