您的位置:首页 > 其它

SurfaceView绘制音乐柱形图

2015-10-30 11:55 351 查看

SurfaceView  绘制时:先走onMeasre方法,在走SurfaceHolder.Callback的surfaceCreated(SurfaceView在创建时系统回掉方法,做一些初始化),在走surfaceDestroyed(SirfaceView在销毁时回掉的方法,在这个方法里可以做一些结束任务的操作)。
package com.sxwdsoft.widget;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.WindowManager;import java.util.ArrayList;import java.util.List;import java.util.Random;public class AnalysisBarChartingView extends SurfaceView implements SurfaceHolder.Callback, Runnable {/*** 屏幕的大小*/private int width, height;/*** view的大小*/private int viewWidth, viewHeight;
private SurfaceHolder holder;//这个对象可以在线程里异步操作获取的canvas对象。private Integer[] origin;private int lineWidth = 1;private boolean running = false;private int gridWidth = 40;private int space = 20;private String[] bgs = {"#FFD39B", "#EEB422", "#E0FFFF", "#919191"};private int[] itemBg = {Color.BLACK, Color.BLUE, Color.DKGRAY, Color.GREEN};public AnalysisBarChartingView(Context context) {super(context);init(context);}public AnalysisBarChartingView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public AnalysisBarChartingView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}private void init(Context context) {DisplayMetrics metrics = new DisplayMetrics();WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);manager.getDefaultDisplay().getMetrics(metrics);width = metrics.widthPixels;height = metrics.heightPixels;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);viewWidth = getDefaultSize(width, widthMeasureSpec);viewHeight = getDefaultSize(height, heightMeasureSpec);holder = getHolder();holder.addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {origin = new Integer[]{10, (viewHeight - 10)};Rect r = new Rect(0, 0, viewWidth, viewHeight);Canvas canvas = holder.lockCanvas(r);canvas.drawColor(Color.parseColor("#CFCFCF"));Paint p = new Paint();p.setAntiAlias(true);p.setColor(Color.RED);p.setStrokeWidth(lineWidth);canvas.drawLine(origin[0], 5, origin[0], origin[1], p);canvas.drawLine(origin[0], origin[1], viewWidth - origin[0], viewHeight - origin[0], p);holder.unlockCanvasAndPost(canvas);new Thread(this).start();running = true;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {running = false;}@Overridepublic void run() {int num = (viewWidth - origin[0]) / (space + gridWidth);List<Rect> rects = new ArrayList<>();List<Paint> paints = new ArrayList<>();int startX = origin[0], startY = origin[1], endX = origin[0], endY = origin[1];for (int i = 0; i < num; i++) {startX = (space * (i + 1) + gridWidth * i);endX = ((space + gridWidth) * (i + 1));rects.add(new Rect(startX, startY, endX, endY));Paint paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.FILL);paint.setColor(itemBg[Math.abs(new Random().nextInt(itemBg.length))]);paints.add(paint);}while (running) {Random random = new Random();Canvas canvas = holder.lockCanvas(new Rect(origin[0], origin[0], viewWidth - origin[0], origin[1]));canvas.drawColor(Color.parseColor(bgs[Math.abs(new Random().nextInt(bgs.length))]));for (int i = 0; i < num; i++) {int y = Math.abs(random.nextInt(origin[1]));while (y < origin[0]||y>origin[1]/2)y = Math.abs(random.nextInt(origin[1]));Log.i("asd", "y=" + y);Rect rect = rects.get(i);rect.top = y;canvas.drawRect(rect, paints.get(i));}holder.unlockCanvasAndPost(canvas);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: