之前一直做的是应用类,这次抽时间,参考网上资料实践了下SurfaceView。目标是在页面上画一个科赫曲线的分形图。

代码如下:

package com.example.fredric.demo02;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager; public class MainActivity extends AppCompatActivity { private int width;
private int height; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth();
height = wm.getDefaultDisplay().getHeight();
setContentView(new MyView(this));
} //知识点备注:
//1、Surface:原始图像缓冲区的句柄,通过该接口可以获取原始缓冲区中的数据;
//Surface 中包含canvas对象
//2、SurfaceView:继承至View,
// 2.1 提供了一个运行在渲染线程的surface
// 2.2 SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用
//3、SurfaceHolder:控制surface的一个抽象接口
//4、SurfaceHolder.Callback: 监听Surface改变的接口
class MyView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder;
private MyThread myThread; public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder = this.getHolder();
holder.addCallback(this);
myThread = new MyThread(holder);
} @Override
public void surfaceCreated(SurfaceHolder holder) {
myThread.isRun = true;
myThread.start();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) {
myThread.isRun = false;
} class MyThread extends Thread {
private SurfaceHolder holder;
public boolean isRun; public MyThread(SurfaceHolder holder) {
this.holder = holder;
isRun = true;
} @Override
public void run() {
int count = 0;
while (isRun) {
Canvas c = null;
c = this.holder.lockCanvas();
try {
synchronized (holder) {
if (null != c){ c.drawColor(Color.WHITE);
Paint p = new Paint();
p.setColor(Color.BLUE);
p.setStrokeWidth((float) 5.0); draw(c, p, 0, 0, width, height, 6); Thread.sleep(1000); isRun = false;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
// 此时才提交绘画结果
holder.unlockCanvasAndPost(c);
}
}
}
}
}//class MyThread extends Thread { public void draw(Canvas c, Paint p, int x1, int y1, int x2, int y2,int depth) { c.drawLine(x1, y1, x2, y2, p); if (depth <= 1) { return;
}
else {//得到三等分点
double x11 = (x1 * 2 + x2) / 3;
double y11 = (y1 * 2 + y2) / 3; double x22 = (x1 + x2 * 2) / 3;
double y22 = (y1 + y2 * 2) / 3; double x33 = (x11 + x22) / 2 - (y11 - y22) * Math.sqrt(3) / 2;
double y33 = (y11 + y22) / 2 - (x22 - x11) * Math.sqrt(3) / 2; c.drawLine(x1, y1, x2, y2, p); draw(c, p, x1, y1, (int) x11, (int) y11, depth - 1);
draw(c, p, (int) x11, (int) y11, (int) x33, (int) y33, depth - 1);
draw(c, p, (int) x22, (int) y22, x2, y2, depth - 1);
draw(c, p, (int) x33, (int) y33, (int) x22, (int) y22, depth - 1);
}
}
}
}

结果:

SurfaceView 绘制分形图的更多相关文章

  1. Android: 利用SurfaceView绘制股票滑动直线解决延迟问题

    1.背景介绍 最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期.如下图所示: 上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间 ...

  2. JavaScript动画实例:递归分形图动态展示

    在“JavaScript图形实例:SierPinski三角形” 和“JavaScript图形实例:Levy曲线及其变形”等文章中我们介绍了通过递归生成分形图形的方法.我们可以将绘制的分形图形每隔一定的 ...

  3. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. php中用GD绘制折线图

    php中用GD绘制折线图,代码如下: Class Chart{ private $image; // 定义图像 private $title; // 定义标题 private $ydata; // 定 ...

  5. 使用Canvas绘制背景图

    原文  http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...

  6. Excel应该这么玩——7、我是预言家:绘制趋势图

    让我们先看一个场景:你是公司销售部的员工,你手里有公司最近几年的销售额相关的数据,经理希望你预测下个月的销售额.盯着一堆数据,你或许会想到画一张XY坐标图,然后将每个月份的销售额标定为一个坐标.但是下 ...

  7. 使用Excel 2007绘制甘特图

    本文将教大家如何使用Excel 2007制作甘特图.Excel并未提供甘特图类型,但还是可以绘制甘特图的,方法就是通过对堆积条形图类型进行自定义,使之显示任务.任务工期和层次结构. 下面的过程可帮助创 ...

  8. 【python】pandas & matplotlib 数据处理 绘制曲面图

    Python matplotlib模块,是扩展的MATLAB的一个绘图工具库,它可以绘制各种图形 建议安装 Anaconda后使用 ,集成了很多第三库,基本满足大家的需求,下载地址,对应选择pytho ...

  9. 利用Flex组件birdeye绘制拓扑关系图

    birdeye绘制拓扑关系图 1.flex简单介绍 Flex 是一个高效.免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash Player和Adobe AI ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(二)—— 项目架构

    阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...

  2. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  3. iOS二维码生成、识别、扫描等

    二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...

  4. .NET 对接JAVA 使用Modulus,Exponent RSA 加密

    最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java  RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...

  5. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  6. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  7. kafka配置与使用实例

    kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列

  8. 从netty-example分析Netty组件续

    上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...

  9. 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)

    建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...

  10. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...