package com.loaderman.customviewdemo;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView; /**
* SurfaceView类的成员函数draw和dispatchDraw的参数canvas所描述的都是建立在宿主窗口的绘图表面上的画布,
* 因此,在这块画布上绘制的任何UI都是出现在宿主窗口的绘图表面上的。
* <p/>
* 本来SurfaceView类的成员函数draw是用来将自己的UI绘制在宿主窗口的绘图表面上的,
* 但是这里我们可以看到,如果当前正在处理的SurfaceView不是用作宿主窗口面板的时候,
* 即其成员变量mWindowType的值不等于WindowManager.LayoutParams.TYPE_APPLICATION_PANEL的时候,
* SurfaceView类的成员函数draw只是简单地将它所占据的区域绘制为黑色。
*/
public class SinSurfaceView extends SurfaceView implements Runnable {
private SurfaceHolder mSurfaceHolder;
/**
* 用于保存正弦路径坐标
*/
private Path mPath;
private Paint mPaint; public SinSurfaceView(Context context) {
super(context);
init();
} public SinSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public SinSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
} private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(Color.GREEN);
//连接处更加平滑
mPaint.setStrokeJoin(Paint.Join.ROUND); mPath = new Path(); /**通过holder去申请绘图表面的画布,surfaceview其实draw()或dispathDraw()都只是一块默认的黑色区域,并不是用作宿主
* 真正要做的事情由开发者自行绘制,绘制之前就是通过holder获取一块内存区域的画布,
* 然后可在UI线程或工作线程在这个画布上进行绘制所需要的视图,最后还是通过holder提交这个画布就可以显示
* */
mSurfaceHolder = getHolder();
//回调
mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
/***
* surfaceview的绘图表面(就是activity宿主创建一个透明的表面用于surfaceView绘制)被创建时执行
* 在updateWindow()创建宿主(activity的窗口)的绘图表面时会回调,虽然surfaceView是独立于一个线程但还是离不开宿主窗口,
* 最后还是要粘贴到window中
*
* surfaceCreated方法,是当SurfaceView被显示时会调用的方法,所以你需要再这边开启绘制的线 程
*
* @param holder
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
new Thread(SinSurfaceView.this).start(); //Animator是在主线程中执行的
ValueAnimator animator = ValueAnimator.ofFloat(0,100.0f);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
if (Looper.myLooper() != Looper.getMainLooper() ){
Log.d("loaderman","不在主线程哦");
}else {
Log.d("loaderman","啊哈,在主线程哦");
}
}
});
animator.start(); } /**
* 创建、更新会认为发生变化也会回调这个方法
* @param holder
* @param format
* @param width
* @param height
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /***
*surfaceDestroyed方法是当SurfaceView被隐藏会销毁时调用的方法,在这里你可以关闭绘制的线程
* @param holder
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isDrawing = false;
}
});
} /***
* 是否在绘制:用于关闭子线程:true则表示一直循环
*/
private boolean isDrawing = true;
private int drawX;
private int drawY; /***
* 注意这个是在子线程中绘制的
*/
@Override
public void run() {
while (isDrawing) {
drawX++;
drawY = (int) (100 * Math.sin(drawX * 2 * Math.PI / 180) + 400);
mPath.lineTo(drawX, drawY);
draw(mPath);
} } /***
* 注意这个是在子线程中绘制的,surface支持子线程更新ui,所以
*/
private void draw(Path path) {
Canvas canvas = null;
//给画布加锁,防止线程安全,防止该内存区域被其他线程公用
canvas = mSurfaceHolder.lockCanvas();
if (null != canvas) {
//清屏操作或者设置背景
canvas.drawColor(Color.WHITE);
canvas.drawPath(mPath, mPaint);
//提交显示视图并解锁,防止长期占用此内存
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }

效果:

SurfaceView之绘制sin曲线的更多相关文章

  1. C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码

    原文:C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码 C#WPF 如何绘制几何图形? 怎么绘制坐标系?绘制sin曲线(正弦曲线)? 这离不开Path(Syst ...

  2. 用html5的canvas画布绘制贝塞尔曲线

    查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  3. 使用python和pygame绘制繁花曲线

    前段时间看了一期<最强大脑>,里面展示了各种繁花曲线组合成的非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意 ...

  4. Matlab绘图基础——绘制三维曲线

    %% 绘制三维曲线 %plot3函数,其中每一组x,y,z组成一组曲线的坐标参数,选项的定义和plot函数相同. %1.当x,y,z是同维向量时,则x,y,z 对应元素构成一条三维曲线. x0 = 0 ...

  5. Matlab | 绘制动态曲线(使用 animatedline 对象)

    效果如下: 示例代码: figure('Color','w'); h1 = animatedline; h1.Color = 'r'; h1.LineWidth = 1.0; h1.LineStyle ...

  6. Matlab 如何绘制复杂曲线的包络线

    Matlab 如何绘制复杂曲线的包络线 http://jingyan.baidu.com/article/aa6a2c14d36c710d4c19c4a8.html 如果一条曲线(比如声音波形)波动很 ...

  7. 4. 绘制光谱曲线QGraphicsView类

    一.前言 Qt的QGraphicsView类具有强大的视图功能,与其一起使用的还有QGraphicsScene类和QGraphicsItem类.大体思路就是通过构建场景类,然后向场景对象中增加各种图元 ...

  8. canvas绘制贝塞尔曲线

    原文:canvas绘制贝塞尔曲线 1.绘制二次方贝塞尔曲线 quadraticCurveTo(cp1x,cp1y,x,y); 其中参数cp1x和cp1y是控制点的坐标,x和y是终点坐标 数学公式表示如 ...

  9. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

    Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...

随机推荐

  1. Linux命令——expr

    前言 有时,在处理命令行时(特别是在处理shell脚本时),您可能会发现自己处于必须执行搜索字符串中的子字符串,查找其索引以及其他内容,或者执行比较和算术运算等情况.上述问题expr都能帮我们解决. ...

  2. [Jenkins][centos]1 持续集成 之 配置VNC,部署Jenkins

    痛点:上一篇的AWS部署的VNC不知为啥挂了,死活连不上,因此改申请京东云做部署Jenkins 预计阅读时间:20分钟 更新软件,安装桌面 yum -y update yum -y groupinst ...

  3. Linux系统Zip压缩和解压缩

    Linux系统可以使用Zip来压缩占用空间较大的文件以便进行文件传输,传输完成后再进行解压缩来获取原文件.Linux安装Zip的命令为 apt-get install zip 安装完成后,使用 zip ...

  4. linux网络编程之posix线程(二)

    继续接着上次的posix线程来学习: 回顾一下创建线程的函数: pthread_att_t属性变量是需要进行初始化才能够用的,一定初始化了属性变量,它就包含了线程的多种属性的值,那到底有哪些属性了,下 ...

  5. [MVC] 自定义ActionSelector,根据参数选择Action[转载]

    很多时候我们会根据UI传入的参数,呈现不同的View.也就是对于同一个Action如何根据请求数据返回不同的View.通常情况下我们会按照如下方法来写,例如: [AcceptVerbs(HttpVer ...

  6. Session&Cookie&localStorage浅谈

    Session&Cookie&localStorage 领导让我开发一个有两张信息表单需要提交页面的网站,我作为一名开发人员,这个需求太简单了,和领导说直接存session sessi ...

  7. flutter,flutter版本version/channel切换问题

    flutter go,官方的指南版本如下: 如何设置版本和channel,尝试 flutter help,发现原来flutter version不单是可以查所有版本(--version查当前版本)还可 ...

  8. 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等

    一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...

  9. web-----chrome DevTools工具的常用使用记录

     注:1.Chrome浏览器,2.在浏览器页面 右键--->检查,即可看到此页面 跟开发沟通过.他们查看一个页面的性能一般都会使用”检查“来观测.查找对应的数据记录. 设置网络的网速和通过设置某 ...

  10. vb开发最全教程

    https://www.xin3721.com/eschool/VisualBasicenet/