SurfaceView之绘制sin曲线
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曲线的更多相关文章
- C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码
原文:C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码 C#WPF 如何绘制几何图形? 怎么绘制坐标系?绘制sin曲线(正弦曲线)? 这离不开Path(Syst ...
- 用html5的canvas画布绘制贝塞尔曲线
查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- 使用python和pygame绘制繁花曲线
前段时间看了一期<最强大脑>,里面展示了各种繁花曲线组合成的非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意 ...
- Matlab绘图基础——绘制三维曲线
%% 绘制三维曲线 %plot3函数,其中每一组x,y,z组成一组曲线的坐标参数,选项的定义和plot函数相同. %1.当x,y,z是同维向量时,则x,y,z 对应元素构成一条三维曲线. x0 = 0 ...
- Matlab | 绘制动态曲线(使用 animatedline 对象)
效果如下: 示例代码: figure('Color','w'); h1 = animatedline; h1.Color = 'r'; h1.LineWidth = 1.0; h1.LineStyle ...
- Matlab 如何绘制复杂曲线的包络线
Matlab 如何绘制复杂曲线的包络线 http://jingyan.baidu.com/article/aa6a2c14d36c710d4c19c4a8.html 如果一条曲线(比如声音波形)波动很 ...
- 4. 绘制光谱曲线QGraphicsView类
一.前言 Qt的QGraphicsView类具有强大的视图功能,与其一起使用的还有QGraphicsScene类和QGraphicsItem类.大体思路就是通过构建场景类,然后向场景对象中增加各种图元 ...
- canvas绘制贝塞尔曲线
原文:canvas绘制贝塞尔曲线 1.绘制二次方贝塞尔曲线 quadraticCurveTo(cp1x,cp1y,x,y); 其中参数cp1x和cp1y是控制点的坐标,x和y是终点坐标 数学公式表示如 ...
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)
Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...
随机推荐
- chrome浏览器的跨域设置
原文:https://www.cnblogs.com/laden666666/p/5544572.html 做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在c ...
- 个性化召回算法实践(三)——PersonalRank算法
将用户行为表示为二分图模型.假设给用户\(u\)进行个性化推荐,要计算所有节点相对于用户\(u\)的相关度,则PersonalRank从用户\(u\)对应的节点开始游走,每到一个节点都以\(1-d\) ...
- 手写butterknife来剖析其原理
基本使用: 对于butterknife库我想基本上都非常熟了,如今在项目中用它也用得非常之频繁了,不过为了学习的完整性,先来简单的回顾一下基本用法,先新建一个工程: 然后给textview增加一个点击 ...
- RollingRegression(滚动回归分析)之Python实现
# -*- coding: utf-8 -*-"""Created on Sat Aug 18 11:08:38 2018 @author: acadsoc"& ...
- Oracle LOB 大对象处理
LOB类型列主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 一.LOB数据类型分类 1.按存储数据的类型分: ①字符类型: CLOB:存储大量 单字节 字符数据. N ...
- appium+python+iOS 环境搭建与使用中常见问题的解决方案链接
(1)WebDriverAgent 安装入门篇:https://www.cnblogs.com/zhanggui/p/9239827.html 重点摘要: 在WDA的Github上也给出了WDA的特性 ...
- HttpReader
头文件: #pragma once #include <afxinet.h> class CSF_HttpDataReader { public: CSF_HttpDataReader(v ...
- python中的函数、生成器的工作原理
1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c ...
- PHP yield占用内存测试
function com($start) { $tmp = []; for($i=0; $i<300000; $i++){ $tmp[] = $i; } $end = memory_get_us ...
- All 关键字
本文档已存档,并且将不进行维护. GROUP BY 子句和 ALL 关键字 SQL Server 2005 Transact-SQL 在 GROUP BY 子句中提供 ALL 关键字.只有在 SELE ...