博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义view实现画个闪烁的心
阅读量:5322 次
发布时间:2019-06-14

本文共 4545 字,大约阅读时间需要 15 分钟。

package com.loaderman.lovecircledemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        LoveView view = new LoveView(this);        setContentView(view);    }}

 

package com.loaderman.lovecircledemo;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;public class LoveView extends SurfaceView implements SurfaceHolder.Callback, Runnable {    boolean       mbloop         = false;    SurfaceHolder mSurfaceHolder = null;    private Canvas canvas;    int miCount = 0;    int y       = 50;    /**     * @param context     */    public LoveView(Context context) {        super(context);        mSurfaceHolder = this.getHolder();        mSurfaceHolder.addCallback(this);        this.setFocusable(true);        this.setKeepScreenOn(true);        mbloop = true;    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        new Thread(this).start();    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        mbloop = false;    }    @Override    public void run() {        // TODO Auto-generated method stub        while (mbloop) {            try {                Thread.sleep(500);            } catch (Exception e) {                // TODO: handle exception            }            synchronized (mSurfaceHolder) {                Draw();            }        }    }    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) {            e.printStackTrace();        }    }}

 效果图:

  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()的时候开启线程,线程每隔500ms就刷新一次,这样我们看到的效果就是闪烁的,每500毫秒 画一次图,根据经过的间隔时间来设置画笔的颜色,然后通过循环描点,画出心形,然后设置字体大小,画字和字下面的横线。

本文学习来源:


 

转载于:https://www.cnblogs.com/loaderman/p/6565915.html

你可能感兴趣的文章
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
eclipse-将同一个文件分屏显示
查看>>
NOIP2013提高组 解题报告
查看>>
Qt中文乱码解决思路
查看>>
mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!
查看>>
[Apple开发者帐户帮助]六、配置应用服务(3)创建地图标识符和私钥
查看>>
poj2388---求奇数个数字的最中间的数
查看>>
对闭包的理解
查看>>
java.lang.OutOfMemoryError异常解决方法
查看>>
Css让文字自适应Table宽度[转]
查看>>
[Javascript] Flattening nested arrays: a little exercise in functional refactoring
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
使用maven构建多模块项目,分块开发
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
jffs2镜像制作
查看>>
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
C#高级编程笔记(一)
查看>>
工作时如何利用空闲时间熟悉项目
查看>>