iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么自定义视图view使用Canvas实现手写板和涂鸦功能
  • 135
分享到

怎么自定义视图view使用Canvas实现手写板和涂鸦功能

2023-07-05 20:07:34 135人浏览 八月长安
摘要

本文小编为大家详细介绍“怎么自定义视图view使用canvas实现手写板和涂鸦功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么自定义视图view使用Canvas实现手写板和涂鸦功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入

本文小编为大家详细介绍“怎么自定义视图view使用canvas实现手写板和涂鸦功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么自定义视图view使用Canvas实现手写板和涂鸦功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

预览图

怎么自定义视图view使用Canvas实现手写板和涂鸦功能

一、xml布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:Android="Http://schemas.android.com/apk/res/android"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <LinearLayout        android:id="@+id/main_linlayout"        android:layout_width="match_parent"        android:layout_height="300dp"        android:orientation="vertical">    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <Button            android:id="@+id/bt"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="确定"/>        <Button            android:id="@+id/bt_clear"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="清空"/>    </LinearLayout>    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="5dp"        android:layout_gravity="center"/></LinearLayout>

布局预览图

怎么自定义视图view使用Canvas实现手写板和涂鸦功能

二、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();        }    }}

读到这里,这篇“怎么自定义视图view使用Canvas实现手写板和涂鸦功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么自定义视图view使用Canvas实现手写板和涂鸦功能

本文链接: https://www.lsjlt.com/news/355394.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 自定义视图view使用Canvas实现手写板和涂鸦功能
    目录预览图一、xml布局二、MainActivity代码三、我们自定义view的类预览图 一、xml布局 <xml version="1.0" encoding="utf-8...
    99+
    2023-05-14
    自定义视图 自定义view 自定义视图使用Canvas Canvas实现手写板 Canvas涂鸦功能
  • 怎么自定义视图view使用Canvas实现手写板和涂鸦功能
    本文小编为大家详细介绍“怎么自定义视图view使用Canvas实现手写板和涂鸦功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么自定义视图view使用Canvas实现手写板和涂鸦功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-05
  • 怎么用纯CSS3实现自定义Tooltip边框涂鸦风格
    这篇文章主要介绍“怎么用纯CSS3实现自定义Tooltip边框涂鸦风格”,在日常操作中,相信很多人在怎么用纯CSS3实现自定义Tooltip边框涂鸦风格问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • Android怎么自定义View实现简易画板功能
    这篇文章主要介绍“Android怎么自定义View实现简易画板功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义View实现简易画板功能”文章能帮助大家解决问题。自定义VIe...
    99+
    2023-06-30
  • 自定义视图view的折线图怎么使用
    这篇文章主要讲解了“自定义视图view的折线图怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“自定义视图view的折线图怎么使用”吧!绘制折线图预览图绘制这个折线图需要都需要哪些步骤?...
    99+
    2023-07-05
  • 自定义视图view怎么实现环形进度条
    这篇文章主要介绍“自定义视图view怎么实现环形进度条”,在日常操作中,相信很多人在自定义视图view怎么实现环形进度条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”自定义视图view怎么实现环形进度条”的疑...
    99+
    2023-07-05
  • 怎么使用Vue+canvas实现视频截图功能
    这篇“怎么使用Vue+canvas实现视频截图功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Vue+canvas...
    99+
    2023-07-02
  • 使用canvas怎么自定义一个头像功能
    使用canvas怎么自定义一个头像功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现细节:因为你要对图片所在的区域进行截图,所以你得制作一张canvas,盖...
    99+
    2023-06-09
  • Android中如何使用自定义view实现ListView下拉的视差特效功能
    这篇文章给大家分享的是有关Android中如何使用自定义view实现ListView下拉的视差特效功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、概述:现在流型的APP如微信朋友圈,QQ空间,微博个人展示都...
    99+
    2023-05-30
    android view listview
  • Java怎么实现视频自定义裁剪功能
    今天就跟大家聊聊有关Java怎么实现视频自定义裁剪功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言下面提供将视频按照自定义尺寸进行裁剪的Java工具类,一如既往的实用主义。Ma...
    99+
    2023-06-28
  • 使用socket.io 和canvas怎么实现一个共享画板功能
    这期内容当中小编将会给大家带来有关使用socket.io 和canvas怎么实现一个共享画板功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。git clone <reposit...
    99+
    2023-06-09
  • 怎么在JavaScript中使用canvas实现一个画板和签字板功能
    怎么在JavaScript中使用canvas实现一个画板和签字板功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。<!DOCTYPE html><...
    99+
    2023-06-06
  • android开发中使用view实现自定义一个进度条功能
    今天就跟大家聊聊有关android开发中使用view实现自定义一个进度条功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、自定义属性:<&#63;xml versi...
    99+
    2023-05-31
    android view roi
  • 使用canvas怎么实现一个拼图功能
    使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后...
    99+
    2023-06-09
  • 怎么用javascript实现自定义事件功能
    这篇文章主要介绍“怎么用javascript实现自定义事件功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用javascript实现自定义事件功能”文章能帮助大家解决问题。概述自定义事件很难派...
    99+
    2023-06-17
  • 使用Canvas怎么实现一个手势控制功能
    使用Canvas怎么实现一个手势控制功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先讲一下思路:首先跟图需求可以知道,作出这样的效果需要一组对象,每个对象有颜色,所占...
    99+
    2023-06-09
  • 使用canvas怎么实现一个手势解锁功能
    使用canvas怎么实现一个手势解锁功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。手势解锁通过手指将屏幕上的九个点依次连接起来形成一个图案,所以叫图案解锁。...
    99+
    2023-06-09
  • 使用canvas怎么实现一个图片打码功能
    使用canvas怎么实现一个图片打码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先创建一个html文件, 并引入 vue 和 elelment-ui(注...
    99+
    2023-06-09
  • vue项目中怎么使用canvas实现截图功能
    本文小编为大家详细介绍“vue项目中怎么使用canvas实现截图功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中怎么使用canvas实现截图功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现效...
    99+
    2023-07-02
  • vue怎么实现用户无限添加自定义填写表单功能
    本篇内容主要讲解“vue怎么实现用户无限添加自定义填写表单功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue怎么实现用户无限添加自定义填写表单功能”吧!效果图:代码如下:<templ...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作