本文讲解主要涉及的知识点: 1.线程控制 2.画图类 3.心形函数 大家先看图片: <ignore_js_op> 因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码: 里面设置两个类,一个是我们的activity类,这个类用来显示示图,然后建一个继承SurfaceView的类,我们在这里面画图。先贴两个累的代码: 主类名:GameMainActivity,画图类类名:Love. | |
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(new FxCanvasView(this, null));setContentView(new Love(this));}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
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;/** * @author CZ * */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) */ @Override public 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 * ) */ @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub new Thread(this).start(); } /* * (non-Javadoc) * * @seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view. * SurfaceHolder) */ @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub mbloop = false; } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { // TODO Auto-generated method stub while (mbloop) { try { Thread.sleep(200); } catch (Exception e) { // TODO: handle exception } synchronized (mSurfaceHolder) { Draw(); } } } /** * * Year:2011 Date:2011-7-27 Time:下午06:52:04 Author:CZ TODO */ private void Draw() { // TODO Auto-generated method stub canvas = 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的了,关于画更好看的心形还有一个函数,大家可以看下: | |
- Android-中常用方法集锦
- Android(安卓)首选网络模式默认值的修改方法
- android 中如何限制 EditText 最大输入字符数(2)
- Android(安卓)Studio 快捷键(转)
- android 屏幕保持唤醒 不锁屏
- Android下使用activation发送邮件
- android 关于自定义Application的使用
- Android(安卓)ZXing改横屏识别为竖屏识别[转]
- Android(安卓)NestedScrollView嵌套RecyclerView的问题
随机推荐
-
Android单元测试(七):Robolectric,在JVM上调
-
Android多分辨率适配框架(1)— 核心基础
-
Android(安卓)Studio3.3打开Android(安卓
-
android:radius设置圆角失败的问题
-
Android进阶——Android视图工作机制之me
-
Android 模拟器安装及使用教程
-
Android软件的自动更新
-
欢迎进入Android的世界
-
Android之我当年爬过的坑
-
Android修改APP版本号