Android中利用画图类和线程画出闪烁的心形,送给亲爱的他大家先看图片:因为前一段时间在写画图类,刚好有一
Android中利用画图类和线程画出闪烁的心形,送给亲爱的他
大家先看图片:
因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:
里面设置两个类,一个是我们的activity类,这个类用来显示示图,然后建一个继承SurfaceView的类,我们在这里面画图。先贴两个累的代码:
主类名:IaiaiMainActivity,画图类类名:Love.
package com.iaiai.activity;import android.app.Activity;import android.os.Bundle;/** * * <p> * Title: IaiaiActivity.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-8-11 * </p> * * @author 丸子 * @version 0.0.1 */public class IaiaiActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Love love = new Love(this);setContentView(love);}}package com.iaiai.activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Typeface;import android.view.SurfaceHolder;import android.view.SurfaceView;/** * * <p> * Title: Love.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-8-11 * </p> * * @author 丸子 * @version 0.0.1 */public class Love extends SurfaceView implements SurfaceHolder.Callback,Runnable {boolean mbloop = false;SurfaceHolder mSurfaceHolder = null;private Canvas canvas;int miCount = 0;int y = 50;/** * @param context */public Love(Context context) {super(context);mSurfaceHolder = this.getHolder();mSurfaceHolder.addCallback(this);this.setFocusable(true);this.setKeepScreenOn(true);mbloop = true;}/* * (non-Javadoc) * * @see * android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder * , int, int, int) */@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}/* * (non-Javadoc) * * @see * android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder * ) */@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubnew Thread(this).start();}/* * (non-Javadoc) * * * @seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view. * SurfaceHolder) */@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubmbloop = false;}/* * (non-Javadoc) * * @see java.lang.Runnable#run() */@Overridepublic void run() {// TODO Auto-generated method stubwhile (mbloop) {try {Thread.sleep(200);} catch (Exception e) {// TODO: handle exception}synchronized (mSurfaceHolder) {Draw();}}}private void Draw() {// TODO Auto-generated method stubcanvas = mSurfaceHolder.lockCanvas();try {if (mSurfaceHolder == null || canvas == null) {return;}if (miCount < 100) {miCount++;} else {miCount = 0;}Paint paint = new Paint();paint.setAntiAlias(true);paint.setColor(Color.BLACK);canvas.drawRect(0, 0, 320, 480, paint);switch (miCount % 6) {case 0:paint.setColor(Color.BLUE);break;case 1:paint.setColor(Color.GREEN);break;case 2:paint.setColor(Color.RED);break;case 3:paint.setColor(Color.YELLOW);break;case 4:paint.setColor(Color.argb(255, 255, 181, 216));break;case 5:paint.setColor(Color.argb(255, 0, 255, 255));break;default:paint.setColor(Color.WHITE);break;}int i, j;double x, y, r;for (i = 0; i <= 90; i++) {for (j = 0; j <= 90; j++) {r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j))* 20;x = r * Math.cos(Math.PI / 45 * j)* Math.sin(Math.PI / 45 * i) + 320 / 2;y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4;canvas.drawPoint((float) x, (float) y, paint);}}paint.setTextSize(32);paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC));RectF rect = new RectF(60, 400, 260, 405);canvas.drawRoundRect(rect, (float) 1.0, (float) 1.0, paint);canvas.drawText("Loving You", 75, 400, paint);mSurfaceHolder.unlockCanvasAndPost(canvas);} catch (Exception e) {}}}关于这个程序要讲解的几点:
1. 画图的时候你可以继承View,也可以继承SurfaceView,这两者的区别在于:surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,还有涉及的surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width, int height)方法,而在SurfaceHolder.Callback 接口回调中可以通过重写来改变这些方法
2.程序其实很简单, 既然生命了Runnable接口,就有相对应的Run方法,在surfaceCreate()的时候开启线程,线程每隔200ms就刷新一次,这样我们看到的效果就是闪烁的,每200毫秒 画一次图,根据经过的间隔时间来设置画笔的颜色,然后通过循环描点,画出心形,然后设置字体大小,画字和字下面的横线。
3.关于心形函数,是从一个例子中看来得,关于x和y的得到,
x = r * Math.cos(Math.PI / 45 * j) * Math.sin(Math.PI / 45 * i) + 320 / 2; y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4;
320是屏幕的宽度,本来竖屏我设置的是480,可是下面得写字,就设置为400的了,关于画更好看的心形还有一个函数,大家可以看下:
1 楼 王海龙 2011-08-12 原来还是美女哦! 