学习导航

第一节:http://blog..net/bobo8945510/article/details/53197727 —自定义View—自定义属性及引用

第二节:http://blog..net/bobo8945510/article/details/53203233 自定义view02—图形绘制

第三节:http://blog..net/bobo8945510/article/details/53213938 自定义View-绘图基础之Path

第四节:http://blog..net/bobo8945510/article/details/53256863 Android实现手写板和涂鸦

第五节:http://blog..net/bobo8945510/article/details/53257232 环形进度条

第六章:http://blog..net/bobo8945510/article/details/53374319 自定义折线图

上周发表的两篇关于涂鸦和环形进度条的文章莫名的就没有了,这很郁闷。FK!本少爷张那么帅,为何会发生如此荒唐的事情,真是岂有此理!这里直接上代码,里面有详细讲解,不懂得请给我留言。

预览图

代码

一、xml布局

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="300dp"

android:orientation="vertical">

android:layout_height="wrap_content"

android:orientation="horizontal">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="确定"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="清空"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="5dp"

android:layout_gravity="center"/>

布局预览图

二、MainActivity代码

package tester.ermu.com.handdrawdemo;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BlurMaskFilter;

import android.graphics.EmbossMaskFilter;

import android.os.Bundle;

import android.util.DisplayMetrics;

import android.view.View;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.LinearLayout;

public class MainActivity extends Activity implements View.OnClickListener{

EmbossMaskFilter emboss;

BlurMaskFilter blur;

DrawView drawView;

private LinearLayout main_linlayout;

private Button bt,bt_clear;

private ImageView img;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init(); //初始化组件

getWH();//获取我们xml布局中view的宽高

}

//获取我们xml布局中view的宽高

private void getWH() {

// 获取创建的宽度和高度

DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);

// 创建一个DrawView,该DrawView的宽度、高度与该Activity保持相同

main_linlayout = (LinearLayout)findViewById(R.id.main_linlayout);

drawView = new DrawView(this, displayMetrics.widthPixels, displayMetrics.heightPixels);

main_linlayout.addView(drawView);

drawView.requestFocus();

}

private void init() {

bt = (Button)findViewById(R.id.bt);

bt.setOnClickListener(this);

bt_clear = (Button)findViewById(R.id.bt_clear);

bt_clear.setOnClickListener(this);

img = (ImageView) findViewById(R.id.img);

}

@Override

public void onClick(View v) {

switch (v.getId()){

case R.id.bt:

Bitmap bit = drawView.getPaintBitmap();

img .setImageBitmap(bit);

break;

case R.id.bt_clear:

drawView.clear();

break;

}

}

}

三、我们自定义view的类

package tester.ermu.com.handdrawdemo;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.PorterDuff;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

public class DrawView extends View {

// 定义记录前一个拖动事件发生点的坐标

float preX;

float preY;

private Path path;

public Paint paint = null;

// 定义一个内存中的图片,该图片将作为缓冲区

Bitmap cacheBitmap = null;

// 定义cacheBitmap上的Canvas对象

Canvas cacheCanvas = null;

public DrawView(Context context) {

super(context);

}

public DrawView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public DrawView(Context context, int width , int height) {

super(context);

// 创建一个与该View相同大小的缓存区

cacheBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

cacheCanvas = new Canvas();

path = new Path();

// 设置cacheCanvas将会绘制到内存中的cacheBitmap上

cacheCanvas.setBitmap(cacheBitmap);

// 设置画笔的颜色

paint = new Paint(Paint.DITHER_FLAG);

paint.setColor(Color.RED);

// 设置画笔风格

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(3);

// 反锯齿

paint.setAntiAlias(true);

paint.setDither(true);

}

@Override

public boolean onTouchEvent(MotionEvent event)

{

// 获取拖动事件的发生位置

float x = event.getX();

float y = event.getY();

switch (event.getAction())

{

case MotionEvent.ACTION_DOWN:

// 从前一个点绘制到当前点之后,把当前点定义成下次绘制的前一个点

path.moveTo(x, y);

preX = x;

preY = y;

break;

case MotionEvent.ACTION_MOVE:

// 从前一个点绘制到当前点之后,把当前点定义成下次绘制的前一个点

path.quadTo(preX, preY, x, y);

preX = x;

preY = y;

break;

case MotionEvent.ACTION_UP:

cacheCanvas.drawPath(path, paint); // ①

path.reset();

break;

}

invalidate();

// 返回true表明处理方法已经处理该事件

return true;

}

@Override

public void onDraw(Canvas canvas)

{

Paint bmpPaint = new Paint();

// 将cacheBitmap绘制到该View组件上

canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); // ②

// 沿着path绘制

canvas.drawPath(path, paint);

}

//获取我们绘制成功后的图片

public Bitmap getPaintBitmap() {

return resizeImage(cacheBitmap, 620, 780);

}

// 缩放

public static Bitmap resizeImage(Bitmap bitmap, int width, int height) {

//获取图片的宽高

int originWidth = bitmap.getWidth();

int originHeight = bitmap.getHeight();

//这里缩放我们的尺寸,缩放多少自己去定义

float scaleWidth = ((float) width) / originWidth;

float scaleHeight = ((float) height) / originHeight;

//进行缩放

Matrix matrix = new Matrix();

matrix.postScale(scaleWidth, scaleHeight);

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, originWidth,

originHeight, matrix, true);

return resizedBitmap;

}

//清除画板

public void clear() {

if (cacheBitmap != null) {

path.reset();

cacheCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

invalidate();

}

}

}

demo地址:http://download..net/detail/bobo8945510/9686780

android canvas 手写,自定义view—Canvas实现手写板和涂鸦功能相关推荐

  1. android里面画布快照,自定义 View - Canvas - 画布操作和快照

    操作 API 备注 移动画布 translate(float dx, float dy) -- 画布旋转 rotate(float degrees) -- 画布旋转 rotate(float degr ...

  2. android米聊手写和涂鸦源码,涂鸦手写齐上阵 新版米聊将快乐进行到底

    "米聊"是由小米科技出品的一款多平台,跨移动.联通.电信运营商的手机端免费即时通讯工具,通过手机网络(WiFi.3G.GPRS),可以跟你的米聊联系人进行无限量的免费的实时的语音对 ...

  3. 在线签名、canvas手写在线签名——小程序端实现在线签名,手写电子签名canvas

    在线签名.canvas手写在线签名--小程序端实现在线签名,手写电子签名canvas 近期公司准备接一个政府的小项目,里头有一个在线签名的需求,老板让我研究一下.于是就...开始思考: 在线手写签名, ...

  4. html5 canvas手写画板 下载图片至本地

    html5 canvas手写画板 下载图片至本地 <!DOCTYPE html> <html><head><meta charset="utf-8& ...

  5. canvas 手写毛笔字效果

    <!doctype html> <html lang="en"> <head><meta charset="UTF-8" ...

  6. android 电子签名 手写签名 功能实现

    android 电子签名  手写签名 功能实现 这个手写的效果 就是一个 重写的的自定义的view  代码如下: package com.example.hand.views;import java. ...

  7. android 手写 流畅,提高Android应用手写流畅度(基础篇)

    在使用android类的手写应用时,整体上都有这样一个印象:android的手写不流畅.不自然,和苹果应用比起来相差太远.本文结合作者亲身经历,介绍一下有效提高手写流畅度的几种方法: 1.未做任何处理 ...

  8. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...

  9. Android实现雪花特效自定义view

    一.前言 这个冬天,老家一直没有下雨, 正好圣诞节,就想着制作一个下雪的特效. 圣诞祝福:平安夜,舞翩阡.雪花飘,飞满天.心与心,永相伴. 圣诞节是传统的宗教节日,对于基 督徒,那是庆祝耶稣的诞生,纪 ...

最新文章

  1. linux 调试利器gdb, strace, pstack, pstree, lsof
  2. 高效管理 GitHub Star,用这几个插件就能做到!
  3. 自动化测试中Python与C/C++的混合使用
  4. 人工智能时代来临,还需要那么多人吗?
  5. mysql中正则表达式的用法_mysql之正则表达式的用法
  6. 阿里云短信接口,函数方法
  7. Eureka 配置参数说明
  8. MySql 手动执行主从备份
  9. python调用excel的宏_配置Office Excel运行Python宏脚本
  10. python简单爬虫程序分析_Python简单爬虫
  11. jQuery 遍历 - closest() 方法 is()方法
  12. win10计算机文件夹隐藏,Win10怎么隐藏文件夹_Win10怎么隐藏此电脑的文件夹-192路由网...
  13. 【学堂上新】大规模动画模拟的一种实现方法
  14. poi PPT 在线预览
  15. 简单的运动模糊效果实现
  16. 黑群晖NAS (ARPL引导)安装教程
  17. Bugku-CTF (web 持续更新) ——新手ctf记录
  18. 在外公网调阅公司内网资料文件【内网穿透】
  19. bars 除障句完整_精选每日一句早安问候语语录49句
  20. JAVA画色盲图_一个色盲竟然能画出这么精美的色彩...

热门文章

  1. 离散数学:计算主析取范式(基于真值表)
  2. 看板管理中看板的定义、构成,以及实际看板案例分享
  3. 三相永磁同步电机的矢量控制学习笔记一
  4. 【全年汇总】2023年CCF人机交互会议截稿时间汇总(持续更新)
  5. 基于手机信令数据的数据清洗和出行方式识别
  6. ANSYS有限元仿真:必备流程和知识(一)
  7. vue 自适应屏幕的宽高度
  8. 2022年PMP考试地点一般会在哪里?
  9. 移动端H5页面调试vConsole
  10. LSPatch —— 一款基于Android的免root框架