广告
返回顶部
首页 > 资讯 > 移动开发 >Android自定义控件实现简单写字板功能
  • 415
分享到

Android自定义控件实现简单写字板功能

写字板Android 2022-06-06 08:06:49 415人浏览 泡泡鱼
摘要

先来看看效果图 就是简单的根据手指写下的轨迹去画出内容 一、实现 之前一篇文章里提到了Android官方给出的自定义控件需要考虑以下几点: 创建View 处理View的布局

先来看看效果图

就是简单的根据手指写下的轨迹去画出内容

一、实现

之前一篇文章里提到了Android官方给出的自定义控件需要考虑以下几点:

创建View

处理View的布局

绘制View

与用户进行交互

优化已定义的View

就按照这个步骤来完成今天的自定义控件

1、创建View
上篇提到创建View这一步的时候要考虑的就是很简单的自定义属性的声明、使用。

今天的控件可以有一些什么自定义属性呢?要实现写字板,其实就是三个东西:写字板的颜色、笔的颜色、笔的粗细。所以接下来自定义属性。


<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="WritingBoardView">
    <attr name="boardBackground" fORMat="color"></attr> <!--画板颜色-->
    <attr name="paintColor" format="color"></attr> <!--画笔颜色-->
    <attr name="paintWidth" format="dimension"></attr> <!--画笔宽度-->
  </declare-styleable>
</resources>

定义了就是为了要使用


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  xmlns:custom="http://schemas.android.com/apk/res-auto"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.qiangyu.test.writingboardview.MainActivity">
  <com.qiangyu.test.writingboardview.view.WritingBoardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    custom:paintColor="@color/colorAccent"
    custom:boardBackground="@color/colorPrimary"
    custom:paintWidth="3Dp"/>
</RelativeLayout>

简单的设置了boardBackground、paintWidth和paintColor属性

使用这里只需要注意命名空间,android提供给我们的用android,我们可以自定义我们属性的命名空间
写法为:xmlns:你取的名=”http://schemas.android.com/apk/res-auto”,这里的res-auto可以换成你控件的包名

在XML布局文件中设置的属性要在自定义属性中获取到,所以我们必须实现带有Context, AttributeSet的构造方法


  private int mBoardBackground;//画板颜色
  private int mPaintColor;//画笔颜色
  private int mPaintWidth;//画笔宽度
  private Path mPath;
  private Paint mPaint;//画笔
  public WritingBoardView(Context context) {
    this(context,null);
  }
  public WritingBoardView(Context context, AttributeSet attrs) {
    this(context, attrs,0);
  }
  public WritingBoardView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context,attrs);
  }
 private void init(Context context,AttributeSet attrs) {
    TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.WritingBoardView);
    mBoardBackground =  a.getColor(R.styleable.WritingBoardView_boardBackground,Color.WHITE);
    mPaintColor =  a.getColor(R.styleable.WritingBoardView_paintColor,Color.BLUE);
    mPaintWidth = a.getDimensionPixelSize(R.styleable.WritingBoardView_paintWidth,
        (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,5,getResources().getDisplayMetrics()));
    a.recycle();
    mPaint = new Paint();
    mPath = new Path();
    setBackgroundColor(mBoardBackground);
    mPaint.setColor(mPaintColor);
    mPaint.setStrokeWidth(mPaintWidth);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setAntiAlias(true);
  }

上面代码确保了每个构造方法最终都调用了第三个构造方法里的init(context,attrs) 方法来获取自定义属性和初始化一些信息

通过固定的写法、简单的获取到自定义属性,并且给当前view设置背景、为Paint设置了样式和颜色。完成写字板很重要的就是这里的Path类。

先来介绍一下Path类

看构造方法的注释



public class Path {
  ...
} 

大体就是说Path封装了由了直线和各种曲线组成几何图形信息。我们可以调用canvas通过drawPath方法来画一些东西。
我们最终的draw就是需要用到drawPath

Path里包含了很多设置几何图形的方法如addRect、addArc。
今天重点说用到的两个方法:


 
  public void moveTo(float x, float y) {
    native_moveTo(mNativePath, x, y);
  } 

moveTo方法就是设置下一个连线或者图形最开始的位置。



  public void lineTo(float x, float y) {
    isSimplePath = false;
    native_lineTo(mNativePath, x, y);
  } 

lineTo方法简单的添加一条上一个点到当前点的线。

有了这两个方法我们就可以实线写字板了

2、处理View的布局
由于这个自定义控件本身就需要一块内容当写字板,所以就不用特别的布局处理了,只是在mode为UNSPECIFIED的时候可能会导致布局显示不出来。

在这里就不进行特殊处理了。

3、绘制View、与用户进行交互
由于该控件本身就需要交互才产生效果,所以之前的两步放在一起考虑了。

上面说到过Canvas有一个drawPath方法。drawPath最后绘制出来什么样其实是看Path里包含的信息。

我们要实现实时显示手写的内容,只需要在滑动的时候获取的坐标通过Path的lineTo方法将线一点一点的连起来。

当手指抬起再落下的时候应该又是一条新的线,所以在落下的时候我们需要调用moveTo方法来为下一条轨迹设置一个起点。


 @Override
  public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    switch (event.getAction()){
      case MotionEvent.ACTION_DOWN:
        mPath.moveTo(touchX,touchY);//重新设置即将出现的线的起点
        break;
      case MotionEvent.ACTION_MOVE:
        mPath.lineTo(touchX,touchY);//连线
        break;
      case MotionEvent.ACTION_UP:
        break;
    }
    invalidate();//通知系统重绘
    return true;//要处理当前事件
  }

在onTouch中return true表示要处理当前事件。并且在每一次操作调用invalidate来绘制界面,我们的onDraw 方法只需要简单的调用drawPath就可以了


 @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawPath(mPath,mPaint);
  }

总结

其实就是通过手指的触摸事件来控制轨迹的改变,按照固定的模式,一个简单的自定义控件就大功告成啦!

一个简单的写字板就基本完成了,当然你感兴趣可以扩展一下,加上在运行时改变画笔的颜色、画板的颜色。添加字体擦除去的功能。

您可能感兴趣的文章:android实现简单的画画板实例代码Android采用双缓冲技术实现画板Android自定义SurfaceView实现画板功能Android多媒体之画画板开发案例分享双缓冲技术实现Android 画板应用一看就懂的Android APP开发入门教程Android基础之使用Fragment控制切换多个页面六款值得推荐的android(安卓)开源框架简介Android实现画板、写字板功能(附源码下载)


--结束END--

本文标题: Android自定义控件实现简单写字板功能

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

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

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

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

下载Word文档
猜你喜欢
  • Android自定义控件实现简单写字板功能
    先来看看效果图 就是简单的根据手指写下的轨迹去画出内容 一、实现 之前一篇文章里提到了android官方给出的自定义控件需要考虑以下几点: 创建View 处理View的布局...
    99+
    2022-06-06
    写字板 Android
  • Android自定义View实现简易画板功能
    本文实例为大家分享了Android自定义View实现简易画板的具体代码,供大家参考,具体内容如下 自定义VIew实现简易画板效果,功能包括清空、选择颜色,选择大小,效果如下 画板布...
    99+
    2022-11-13
  • Android 自定义控件实现显示文字的功能
    Android 自定义控件实现显示文字的功能 自定义控件—–逐个显示文字 ONE Goal ,ONE Passion ! 前言: 今天要实现的效果时.让我们的文字一个一个显示出...
    99+
    2022-06-06
    自定义 自定义控件 Android
  • Android自定义控件实现简单的轮播图控件
    最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码。于是自己封装了一下。本篇轮播图...
    99+
    2022-06-06
    轮播图 轮播 Android
  • Android怎么自定义View实现简易画板功能
    这篇文章主要介绍“Android怎么自定义View实现简易画板功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义View实现简易画板功能”文章能帮助大家解决问题。自定义VIe...
    99+
    2023-06-30
  • Android自定义控件简单实现侧滑菜单效果
    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的...
    99+
    2022-06-06
    菜单 Android
  • Android自定义SurfaceView实现画板功能
    接触了这么久的View,总不能一直停留在View里,现在开始呢,就要学习一个新的知识点:SurfaceView,实际上SurfaceView与View的原理都差不多,只是效率和...
    99+
    2022-06-06
    surfaceview 画板 Android
  • VueelementUI自定义表单模板组件功能实现
    elementUI 实现一个自定义的表单模板组件注:该功能基于elementUI 背景:在项目开发中,我们会遇到这种需求,在管理后台添加自定义表单,在指定的页面使用定义好的表单 直...
    99+
    2022-12-24
    Vue elementUI 自定义表单模板组件 Vue elementUI 自定义表单
  • Android自定义控件实现简单滑动开关效果
    本文实例为大家分享了Android自定义控件实现简单滑动开关的具体代码,供大家参考,具体内容如下 ToggleButton 滑动开关 项目概述 滑动开关是一个纯粹的自定义控件,上面的...
    99+
    2022-11-13
  • Android组合控件实现功能强大的自定义控件
    通常情况下,Android实现自定义控件无非三种方式。   Ⅰ、继承现有控件,对其控件的功能进行拓展。   Ⅱ、将现有控件进行组合,实现功能更加强大控件。   Ⅲ、重写View...
    99+
    2022-06-06
    自定义 自定义控件 Android
  • Android自定义控件实现九宫格解锁功能
    最终Android九宫格解锁效果如下进行定义实体point点public class Point { private float x; private float y; //正常模式 public static final int NORM...
    99+
    2023-05-31
    android 九宫格 解锁
  • Android自定义控件实现底部菜单(上)
    今天我们封装一个底部的菜单栏,这个大多数的应用都会用到,因此我们来自定义,方便以后项目的使用。 该控件的实现将分上下篇来介绍,先来看一个菜单栏的子控件–MenuItemM,这个...
    99+
    2022-06-06
    菜单 Android
  • Android自定义控件实现底部菜单(下)
    在app中经常会用到底部菜单的控件,每次都需要写好多代码,今天我们用到了前几篇博客里的控件来进一步封装底部菜单。先看效果图: 主要包括以下功能: 1 设置icon以及点击之...
    99+
    2022-06-06
    菜单 Android
  • android自定义控件实现简易时间轴(2)
    这篇做了一个简单的时间轴控件。右侧的数据就是一个简单的字符串。问题还是有的,当右侧的文字长度不一样的时候就会有问题了。现在可以修改一下适配右侧的文字。 效果如下: 代码: priv...
    99+
    2022-11-13
  • android自定义控件实现简易时间轴(1)
    本文实例为大家分享了android自定义控件实现简易时间轴的具体代码,供大家参考,具体内容如下 之前项目需要写一个消费记录,类似于时间轴似的控件,自身在自定义控件这里不咋地(&hel...
    99+
    2022-11-13
  • Android自定义控件单位尺寸实现代码
    一、自定义控件的单位和尺寸 1.一般在PC上会使用px(像素)和pt(磅)作为单位,但是在手机上由于不断地会更新手机屏幕的分辨率,因此使用这两个单位不再那么合适。可能在一部低分...
    99+
    2022-06-06
    Android
  • android自定义控件如何实现简易时间轴
    这篇“android自定义控件如何实现简易时间轴”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“android自定义控件如何实现简易时间轴”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过...
    99+
    2023-06-28
  • android自定义控件是怎么实现简易时间轴
    这篇文章主要为大家分析了android自定义控件是怎么实现简易时间轴的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“android自定义控件是怎么实现简易时间...
    99+
    2023-06-28
  • Android自定义控件实现万能的对话框
    自定义控件有段时间没更新了,今天给大家带来一个新的对话框样式,本着用更少的代码实现更丰富的功能。 由于对话框对用户的操作有影响,所以目前app上的对话框用的已经比较少了,但还是...
    99+
    2022-06-06
    万能 Android
  • Android如何实现自定义View展开菜单功能
    这篇文章主要为大家展示了“Android如何实现自定义View展开菜单功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何实现自定义View展开菜单功能”这篇文章吧。效果图思路下...
    99+
    2023-05-31
    android view
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作