Android中Canvas绘图方法的实现

news/2024/7/8 5:39:28 标签: Android, Canvas, 图形, 2D

Android2D图形可以使用Canvas来实现,我们可以通过重写View.onDraw()方法来实现Canvas对象。


常用方法

drawBitmap()

绘制位图

drawCircle()

绘制圆形

drawColor()

绘制填充画布颜色

drawLine()

绘制直线

drawPath()

绘制路径

drawPoint()

绘制点

drawRect()

绘制矩形

drawText()

绘制文字


最终效果

 

创建项目

 

实现代码

MainActivity.java

package com.lujie.canvasdemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;


public class MainActivity extends Activity {

	private LinearLayout layout;
	private Button button_drawLine;
	private Button button_drawCircle;
	private Button button_drawRect;
	private Button button_dark;
	private Button button_drawPoint;
	private Button button_drawLogo;
	private Button button_drawText;
	private Button button_autoDraw;
	
	private boolean flag = false;
	
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        initUI();
    }
    
    private void initUI() {
    	layout = (LinearLayout) findViewById(R.id.linearLayout_main);
    	button_drawLine = (Button) findViewById(R.id.button_drawLine);
    	button_drawCircle = (Button) findViewById(R.id.button_drawCircle);
    	button_drawRect = (Button) findViewById(R.id.button_drawRect);
    	button_dark = (Button) findViewById(R.id.button_dark);
    	button_drawPoint = (Button) findViewById(R.id.button_drawPoint);
    	button_drawLogo = (Button) findViewById(R.id.button_drawLogo);
    	button_drawText = (Button) findViewById(R.id.button_drawText);
    	button_autoDraw = (Button) findViewById(R.id.button_autoDraw);
    	
    	final MyView view = new MyView(this);
    	DisplayMetrics display = new DisplayMetrics();
    	getWindowManager().getDefaultDisplay().getMetrics(display);
    	int width = display.widthPixels;
    	
    	view.setMinimumWidth(width);
    	view.setMinimumHeight(width);
    	view.setWidth(width);
    	layout.addView(view);
    	
    	button_drawLine.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(1);
				view.invalidate();	
			}
		});
    	
    	button_drawCircle.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(2);
				view.invalidate();	
			}
		});
    	
    	button_drawRect.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(3);
				view.invalidate();	
			}
		});
    	
    	button_dark.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(4);
				view.invalidate();	
			}
		});
    	
    	button_drawPoint.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(5);
				view.invalidate();	
			}
		});
    	
    	button_drawLogo.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(6);
				view.invalidate();	
			}
		});
    	
    	button_drawText.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				view.setDrawType(7);
				view.invalidate();	
			}
		});
    	
    	button_autoDraw.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				if(flag)	view.stopDraw();
				else	view.autoDraw();
				flag = !flag;
			}
		});
    }
}

 

MyView.java

package com.lujie.canvasdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.view.View;

public class MyView extends View{
	
	private int width;
	private int drawType = -1;
	private Thread thread = null;
	private boolean flag = false;
	
	public MyView(Context context) {
		super(context);
	}
	
	public void setWidth(int width) {
		this.width = width;
	}
	
	public void setDrawType(int drawType) {
		this.drawType = drawType;
	}
	
	public void autoDraw() {
		flag = true;
		thread = new Thread() {
			public void run() {
				for(drawType = 1; flag; drawType++) {
					if(drawType > 7) {
						drawType = 1;
					}
					setDrawType(drawType);
					postInvalidate();
					try {
						Thread.sleep(1000);
					}catch(InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		thread.start();
	}
	
	public void stopDraw() {
		flag = false;
	}
	
	protected void onDraw(Canvas canvas) {
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(Color.rgb(255,255,215));
		canvas.drawRect(new Rect(0, 0, width, width), paint);
		
		switch(drawType) {
		case 1:
			paint.setColor(Color.CYAN);
			canvas.drawLine(50, 50, 180, 180, paint);
			break;
		case 2:
			paint.setColor(Color.RED);
			canvas.drawCircle(width/2, width/2, 50, paint);
			break;
		case 3:
			paint.setColor(Color.rgb(85,99,200));
			canvas.drawRect(50, 50, 150, 120, paint);
			break;
		case 4:
			canvas.drawColor(Color.rgb(235,235,195));
			break;
		case 5:
			paint.setColor(Color.rgb(55,55,99));
			canvas.drawPoint(50, 50, paint);
			canvas.drawPoint(60, 50, paint);
			canvas.drawPoint(70, 50, paint);
			canvas.drawPoint(80, 50, paint);
			canvas.drawPoint(80, 55, paint);
			canvas.drawPoint(80, 60, paint);
			canvas.drawPoint(80, 65, paint);
			canvas.drawPoint(80, 70, paint);
			canvas.drawPoint(80, 75, paint);
			canvas.drawPoint(90, 50, paint);
			canvas.drawPoint(100, 50, paint);
			canvas.drawPoint(110, 50, paint);
			break;
		case 6:
			paint.setColor(Color.rgb(208,135,68));
			paint.setAntiAlias(true);
			float scale = 1.8f;
			Path path1 = new Path();
			path1.moveTo(120*scale, 30*scale);
			path1.lineTo(40*scale, 22*scale);
			path1.lineTo(30*scale, 30*scale);
			path1.lineTo(40*scale, 38*scale);
			path1.close();
			canvas.drawPath(path1, paint);
			Path path2 = new Path();
			path2.moveTo(120*scale, 55*scale);
			path2.lineTo(40*scale, 47*scale);
			path2.lineTo(30*scale, 55*scale);
			path2.lineTo(40*scale, 63*scale);
			path2.close();
			canvas.drawPath(path2, paint);
			Path path3 = new Path();
			path3.moveTo(120*scale, 80*scale);
			path3.lineTo(40*scale, 72*scale);
			path3.lineTo(30*scale, 80*scale);
			path3.lineTo(40*scale, 88*scale);
			path3.close();
			canvas.drawPath(path3, paint);
			Path path4 = new Path();
			path4.moveTo(35*scale, 20*scale);
			path4.lineTo(35*scale, 90*scale);
			path4.lineTo(20*scale, 85*scale);
			path4.lineTo(20*scale, 25*scale);
			path4.close();
			canvas.drawPath(path4, paint);
			break;
		case 7:
			paint.setColor(Color.rgb(88, 210, 64));
			paint.setTextSize(40);
			canvas.drawText("天天开心", 40, width/2, paint);
			break;
		}
	}
}

 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout_main"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.lujie.canvasdemo.MainActivity" >

	<LinearLayout 
	    android:orientation="horizontal"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    >
	    <Button
	        android:id="@+id/button_drawLine"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	       	android:layout_weight="1"
	       	android:background="#AF6"
	        android:text="直线" />

	    <Button
	        android:id="@+id/button_drawCircle"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:background="#DFC"
	        android:text="圆形" />

	    <Button
	        android:id="@+id/button_drawRect"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:background="#AF6"
	        android:text="矩形" />

	    <Button
	        android:id="@+id/button_dark"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:background="#DFC"
	        android:text="底色加深" />

	</LinearLayout>
	
	<LinearLayout
	   	android:orientation="horizontal"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    >
		<Button
		    android:id="@+id/button_drawPoint"
		    android:layout_width="0dp"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:background="#DFC"
		    android:text="点" />

		<Button
	        android:id="@+id/button_drawLogo"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:background="#AF6"
	        android:text="图案" />
	
	    <Button
	        android:id="@+id/button_drawText"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:background="#DFC"
	        android:text="文字" />
	
	    <Button
	        android:id="@+id/button_autoDraw"
	        android:layout_width="0dp"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:background="#AF6"
	        android:text="自动播放" />
	</LinearLayout>

</LinearLayout>

 

参考文档

http://www.android-doc.com/reference/android/graphics/Canvas.html

 


http://www.niftyadmin.cn/n/1619327.html

相关文章

513. 找树左下角的值(层级遍历)

513. 找树左下角的值&#xff08;层级遍历&#xff09;题目解题思路代码题目 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 解题思路 用层级遍历&#xff0c;维护一个变量firstNode来存放每一层的第一个节点。我们从左往右的层级便遍历&#xff0c;因为first…

JavaScript实现存款利息计算器

最终效果 实现代码 <!DOCTYPE html> <html> <head><title></title><style type"text/css">* {font: normal normal 15px "微软雅黑";}div {width: 380px;margin: 0 auto;}table {margin: 20px auto;}input {width: 18…

JSR303

JSR303作用大概步骤因为以后要处理的异常很多&#xff0c;所以做一个统一的异常处理&#xff1a;ControllerAdvice作用 往往我们会在前端进行一些表单校验等等&#xff0c;来确保传递的值是合法的。但是有一些手段可以绕过前端表单校验&#xff0c;所以我们需要在后端对javaBe…

144. 二叉树的前序遍历(前序遍历)

144. 二叉树的前序遍历题目解题思路代码题目 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 提示&#xff1a; 树中节点数目在范围 [0, 100] 内-100 < Node.val < 100 解题思路 很简单&#xff0c;前序遍历。 代码 class Solution {List<I…

JavaScript仿记事本的替换功能

最终效果 实现代码 <!DOCTYPE html> <html> <head><title></title><style type"text/css">* {font-family: "黑体";}h1 {font-size: 24px;text-align: center;}#center {width: 420px;margin: 0 auto;}.right {text-a…

程序员常用网址收藏

技术社区 CSDN首页-全球最大中文IT社区 http://www.csdn.net/ 掘金https://juejin.im/timeline 开源中国 - 找到您想要的开源项目&#xff0c;分享和交流http://www.oschina.net/ 月光博客-关注互联网和搜索引擎的IT科技博客http://www.williamlong.info/ 鸿鹄论坛-CCNA,…

145. 二叉树的后序遍历(后序遍历)

145. 二叉树的后序遍历题目解题思路代码题目 给定一个二叉树&#xff0c;返回它的 后序 遍历。 解题思路 简单&#xff0c;后序遍历 代码 class Solution {List<Integer> listnew ArrayList<>();public List<Integer> postorderTraversal(TreeNode roo…

CMT-CQUPT 第一届 ACM 校赛环境搭建(PC^2)

重邮移通第一届大学生程序设计大赛由129人组成的43支队伍参与&#xff0c;8道题&#xff0c;时长4小时&#xff0c;总计提交501次。校赛使用了ACM-ICPC广泛使用的PC^2软件&#xff0c;该软件还是比较稳定、好用的&#xff0c;在比赛时没有出现故障。我赛前5天进行环境部署&…