Android实现一个可以移动,删除,保存,自定义样式的便签app

    最近一直在研究安卓的自定义View的绘制,不过只是简单的单个模块练习远远达不到期望的水准,于是,决定通过完全的自定义View实现一个便签的app,一是为了提升自己对View绘制的掌握水平,二是这个app可以用来随时记录生活中的闪光点或者学习要点,在有空的时候对这些要点进行挖掘与回顾。

    app实现了便签的创建,保存,删除,多样式选择,详见gif:

    

Android实现一个可以移动,删除,保存,自定义样式的便签app_第1张图片 便签的新建编辑与移动
Android实现一个可以移动,删除,保存,自定义样式的便签app_第2张图片 便签的删除与保存后重新加载

 

app功能比较少,结构特别简单,主要包含5个模块,bean模块包含便签和样式,input模块包含对输入法的监听与便签内容的编辑,interface模块包含样式的定义,可以通过继承HtModel简单实现新的样式,utils一些工具类,具体可以看代码,view包含两个模块,最重要的是HtLayout,这是整个界面的主体,HtModel1-4是各种样式。

Android实现一个可以移动,删除,保存,自定义样式的便签app_第3张图片 项目结构

 

 HtLayout是整个app的核心,代码已经做了很详细的注释了,可以很清晰的看到整个布局绘制及事件的脉络。HtLayout主要是两大功能,一个是各个模块的绘制工作,第二个是与用户的交互事件。

package com.jaden.htlabel.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;

import com.jaden.htlabel.bean.Label;
import com.jaden.htlabel.bean.Model;
import com.jaden.htlabel.input.HtLayoutInput;
import com.jaden.htlabel.interfaces.HtModel;
import com.jaden.htlabel.utils.DensityUtil;
import com.jaden.htlabel.utils.KeyBoardUtil;
import com.jaden.htlabel.utils.LabelUtil;
import com.jaden.htlabel.utils.ModelUtil;
import com.jaden.htlabel.utils.PointUtil;
import com.jaden.htlabel.utils.RectUtil;
import com.jaden.htlabel.utils.SqlUtil;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Created Date: 2018/12/13
 * Description:
 */
public class HtLayout extends View{
    private static final int COLOR_EDIT = Color.parseColor("#45344533");
    private static final float MODEL_HEIGHT = DensityUtil.dp2px(50); //50dp
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

    //整个布局分为两个部分,一个是专门用来展示label的范围,一个是专门用来展示样式的范围
    private RectF mLabelRect = new RectF(); //label的范围
    private RectF mModelRect = new RectF(); //model的范围

    private Rect mDirtyRect = new Rect(); //绘制的脏区域

    private List

整个绘制分为两大部分,一个是上面的标签区域的绘制,第二个是最下面样式的绘制。

标签区域实际上是所有标签的依次绘制,对于单个label标签而言,分为主体背景,上面的时间,下面的标签内容三个部分,如果标签被选中,那么则会在标签内容上覆盖一个Rect的蒙板,通过对label各参数的解析,可以完成从上到下的依次绘制。

样式的绘制更加简单,只用绘制Rect背景区域以及文字。

 

与用户的交互,主要分四个部分:

第一个是新建label时候,从样式滑动到label主体这个事件,在事件结束后新建一个label,插入到数据库。

第二个是label的自由滑动,这个只用改变label的坐标,然后注意重叠时候的绘制次序即可,不过需要注意的是,如果多个label重叠,那么选中重叠区域的时候,要对label的zOrder做一个判断,返回最上面的label给用户操作。

第三个是label的删除,如果移出了标签区域,那么就将label从List里面删除,保存数据库即可。

第四个是label数据的编辑,这个是通过继承BaseInputConnection来实现对软键盘事件及字符串输出的监听。

 

整个app的大概脉络已经讲清楚了,具体的可以参考源代码进行阅读。

你可能感兴趣的:(Android,Application)