关于安卓绘画板的算法 介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于安卓绘画板的算法 介绍相关的知识,希望对你有一定的参考价值。

您好,这样的:
1.将背景图片在屏幕的canvas画布上先画好,例如canvas.drawBitmap(bgBitmap,0,0,null);
2.新建一个Bitmap,例如Bitmap tempBitmap=Bitmap.createBitmap(100,100,Config.ARGB_4444);并以此Bitmap新建一个临时画布canvas例如:Canvas temptCanvas=new Canvas(tempBitmap);然后再执行一步把tempBitmap的背景色画成透明的temptCanvas.drawColor(Color.TRANSPARENT);这样做的目的是把新建的那个临时画布的目标定位在哪个tempBitmap上,这样做以后,调用temptCanvas的一切draw函数,都会把相应的图像画在临时的tempBitmap上,而不是
在原先的屏幕上。
3.临时画布temptCanvas和临时Bitmap建好后,下面就是开始绘画了,要注意的是现在的画点,画线什么的都是调用temptCanvas而不是原先屏幕上的canvas,比如应该是temptCanvas.drawPoint ,temptCanvasRect, temptCanvas.drawLine等等,如果现在要画橡皮的痕迹,那么先要设置画笔的颜色mPaint.setColor(Color.BLACK);这里只要不设置成Color.TRANSPARENT透明色就行,颜色任意;再设置画笔的模式paint.setXfermode(new PorterDuffXfermode(Mode.DST_OUT));这一步非常重要,它的作用是用此画笔后,画笔划过的痕迹就变成透明色了。画笔设置好了后,就可以调用该画笔进行橡皮痕迹的绘制了,例如temptCanvas.drawPath(eraPath,mPaint);
4.在所有的画笔痕迹和橡皮痕迹绘制完成后,执行最后一步,canvas.drawBitmap(tempBitmap,0,0,null);这里要注意的是canvas而不是temptCanvas了!temptCanvas负责的是将各种画笔痕迹画在tempBitmap上,而canvas负责将tempBitmap绘制到屏幕上。
参考技术A Q

安卓 基于AppCompatImageView的画板视图,任意画线

PaletteLib

介绍

画板视图,支持任意画线段的一个视图组件
继承至特定View可以用原View的基本特性
支持视图导出为图片bitmap以及导出到文件

依赖引入

工程的build.gradle文件添加

allprojects 
    repositories 
        google()
        mavenCentral()

        //jitpack 仓库
        maven  url 'https://jitpack.io' 
    

APP的build.gradle文件添加

dependencies 
    ...
    implementation 'com.gitee.osard:palettelib:1.1.0'
    implementation 'androidx.appcompat:appcompat:1.2.0'

使用

  • 基础画板View
    /**
     * 用途:画板视图,自定义继承控件后,使用此类即可简单集成画板
     * <p>
     * 注:布局和部分控件需要设置背景后才能绘制线段
     *
     * <p>
     * 作者:MJSoftKing
     */
    public class BasePalette 
  • 自定义任意View添加画板能力
    /*
     布局控件需要设置背景后才能绘制线段
    */
    public class TestView extends RelativeLayout 

        //此对象拥有画板操作权
        public BasePalette palette;

        public TestView(@NonNull Context context) 
            super(context);
            palette = BasePalette.create(this);
        

        public TestView(@NonNull Context context, @Nullable AttributeSet attrs) 
            super(context, attrs);
            palette = BasePalette.create(this);
        

        public TestView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) 
            super(context, attrs, defStyleAttr);
            palette = BasePalette.create(this);
        

        @Override
        @SuppressLint("ClickableViewAccessibility")
        public boolean onTouchEvent(MotionEvent event) 
            return palette.onTouchEvent(event) || super.onTouchEvent(event);
        

        @Override
        protected void onDraw(Canvas canvas) 
            super.onDraw(canvas);
            palette.onDraw(canvas);
        
    
  • 已提供的View
    PaletteImageView   继承至 AppCompatImageView
    PaletteTextView    继承至 AppCompatTextView
    PaletteView        继承至 View
  • layout引入
<com.mjsoftking.palettelib.PaletteImageView
    android:id="@+id/handView"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@mipmap/ic_launcher" />
  • 组件提供的方法
    /**
     * 设置画笔颜色,HTML形式
     * <p>
     * 设置后下次落笔生效,先前已画线段不会改变
     *
     * @param htmlColor 如:#000000
     */
    public void setPaintColor(String htmlColor);
    /**
     * 设置画笔颜色,ColorRes资源
     * <p>
     * 设置后下次落笔生效,先前已画线段不会改变
     */
    public void setPaintColor(@ColorRes int color);
    /**
     * 设置画笔宽度
     * <p>
     * 设置后下次落笔生效,先前已画线段不会改变
     *
     * @param width 单位像素
     */
    public void setStrokeWidth(float width);
    /**
     * 设置画笔宽度
     * <p>
     * 设置后下次落笔生效,先前已画线段不会改变
     *
     * @param dbWidth 单位db
     */
    public void setStrokeDbWidth(int dbWidth);
    /**
      * 设置是否启用绘制能力,关闭后和普通组件无区别
      * <p>
      * 默认:启用
      */
     public void setEnableDraw(boolean enableDraw);
    /**
     * 设置自定义画笔,优先级高于单属性控制
     * <p>
     * 设置后下次落笔生效,先前已画线段不会改变
     *
     * @param paint 自定义画笔对象
     */
    public void setPaint(Paint paint);
    /**
     * 获取所有线段
     * <p>
     * 每个线段下都有一组点的列表
     */
    public List<List<PalettePoint>> getLines();
    /**
     * 当触摸抬起时,所画线段只是起点坐标或者所有点坐标均相同时,移除此次所画线段,因为他不是线段只是点
     * <p>
     * 默认启用此策略
     */
    public void setRemoveLastNotLine(boolean removeLastNotLine);
    /**
     * 是否响应 onClick 事件
     * <p>
     * 默认:关闭
     * 启用时,触摸抬起时触摸点在控件上时会响应点击事件,反之不响应
     * 关闭时,不响应点击事件
     */
     public void setEnableOnClick(boolean enableOnClick);
    /**
     * 撤销上一次绘制
     */
    public void revocation();
    /**
     * 清空绘制
     */
    public void clear();
    /**
     * 获取视图的截图
     */
    public Bitmap screenShot();
    /**
     * 将视图的截图保存到指定的文件
     *
     * @param fileName 全路径携带文件名,绝对路径
     * @param format   格式,参考@link Bitmap.CompressFormat
     * @param quality  压缩质量,参考@link Bitmap.CompressFormat
     */
    public void saveBitmap(String fileName, Bitmap.CompressFormat format, int quality) throws IOException ;
    /**
     * 将视图的截图保存到指定的文件
     * <p>
     * 默认保存到:存储-Android-data-包名-files-images文件夹下
     * 文件格式 png
     * png格式质量字段被忽略
     */
    public String saveBitmap() throws IOException ;

License

Copyright 2021 mjsoftking

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

以上是关于关于安卓绘画板的算法 介绍的主要内容,如果未能解决你的问题,请参考以下文章

Android绘画板(普通绘画模式和缩放平移绘画模式)

什么是手写绘画板

Day08 - HTML5 Canvas 实现彩虹画笔绘画板指南

canvas绘画板效果 html+css+js

canvas绘画板效果 html+css+js

涂鸦板是啥?