自定义View系列(七)

Android自定义View系列之详解View的绘制流程 一、开场白 开讲之前我们先预设一种自定义ViewGroup的场景:我们知道LinearLayout、FrameLayout、RelativeLayout...都是系统定义实现的布局,我们想要自定义一个FlowLayout流式布局实现我们自己要的效果(自定义不就是按照自己想要的效果实现的一种布局),流式布局目前Google官方还没帮我们提供,但网上有很多自定义的流式布局,也都是开发者们自己继承ViewGroup实现的,今天以自定义ViewGroup实现流式布局FlowLayout为大前提讲解View的绘. 阅读详情

自定义View实战之

自定义LinearLayout,该LinearLayout用于包EditText,解决EditText与ScrollView的滑动冲突

当EditText放在ScrollView里面,存在滑动冲突。

注:当EditText中内容的高度大于EditText的高度时,我们需要滑动EditText。

我们要解决掉这个滑动冲突,实现:

1、当EditText中的内容的高度超出EditText的高度时,我们在EditText的区域上滑动,可以滑动EditText的内容。

2、当EditText中的内容的高度不超出EditText的高度时,我们在EditText的区域上滑动,仍然滑动ScrollView。

解决思路:

在EditText外面包一层LinearLayout,这个LinearLayout是我们自定义的。代码如下:

public class ScrollViewInsideLinearLayout extends LinearLayout {
    private ScrollView parentScrollView;
    private EditText editText;
    private int showLineMax = 0;

    public void setParentScrollView(ScrollView parentScrollView) {
        this.parentScrollView = parentScrollView;
    }

    public void setEditText(EditText editText) {
        this.editText = editText;
        ScrollViewInsideLinearLayout.LayoutParams lp = (LayoutParams) editText.getLayoutParams();
        showLineMax = lp.height / editText.getLineHeight();
    }

    public ScrollViewInsideLinearLayout(Context context) {
        super(context);
    }

    public ScrollViewInsideLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (parentScrollView == null) {
            return super.onInterceptTouchEvent(ev);
        } else {
            if (ev.getAction() == MotionEvent.ACTION_DOWN && editText.getLineCount() >= showLineMax) {
                //将父scrollView的滚动事件拦截
                setParentScrollAble(false);
            } else if (ev.getAction() == MotionEvent.ACTION_UP) {
                //把滚动事件恢复给父scrollView
                setParentScrollAble(true);
            }
        }
        return super.onInterceptTouchEvent(ev);
    }

    /**
     * 是否把滚动事件交给scrollView
     * @param flag
     */
    private void setParentScrollAble(boolean flag) {
        parentScrollView.requestDisallowInterceptTouchEvent(!flag);
    }

然后,在业务代码里,我们设置下:

scrollViewInsideLinearLayout.setParentScrollView(scrollView);
scrollViewInsideLinearLayout.setEditText(et_info);

这样子,就可以了。

 

这里我们主要就是重写onInterceptTouchEvent方法,以及使用到了requestDisallowInterceptTouchEvent方法。

简单说说Android自定义view学习推荐的方式 这几天比较受关注,挺开心的,嘿嘿。 这里给大家总结一下学习自定义view的一些技巧。 1.首先 去看看鸿洋神的博客 Android 自定义view(1). 鸿洋神的入门教程讲的很详细。再次膜拜。 然后我这里对上面博客补充一些内容,那就是MeasureSpec相关的一些东西,这些东西我在《圆形百分比》这篇博客里提到过。 ---------------------------- 阅读详情

相关推荐

Android自定义View系列之理论基础知识

一、坐标系(屏幕坐标系和布局坐标系) 在Android坐标系中,以屏幕左上角作为原点,这个原点向右是X轴的正轴,向下是Y轴正轴,所以开发中调用方法的时候就有了以屏幕上边和左边为参考值,有了参考值你才好定位呀。 除了上面说的Android坐标系,到了View布局的时候有布局坐标系(也称View坐标系,但这种坐标系是相对的,因为Android中的View/ViewGroup是嵌套存在),布局坐标的关系如下图 上图中最里层是一个View(如TextView/Button/ImageView....

sunbinkang的博客 714

自定义View之继承LinearLayout

自定义View有三种方式: 1:完全自定义View,也就是继承View,或者ViewGroup还有就是SurfaceView 2:半自定义View,所谓半自定View就是继承SDK中已经写好的一些View,比如LinearLayout、RelativeLayout、FragmentLayout、Dialog等等 3:混合自定义View,混合自定义就是在XML文件中引入已经写好的自定义View

Augustine的博客 1万+

安卓面试之自定义View流程及原理

自定义View原理学习博客整理

lentolove的博客 3411

如何自定义LinearLayout

本文参考并引用:http://my.oschina.net/kingguary/blog/63730 最近通过看别人代码和网上搜索,发现现在自定义LinearLayout的方式有三种。 第一种是在扩展的LinearLayout构造函数中使用Inflater加载一个布局,并从中提取出相关的UI组件进行封装,形成一个独立的控件。在使用该控件时,由于它所有的子元素都是在运行时通过代码动态

蚁人日记 1334

自定义view系列---继承view实现TextView效果

自定义view系列,前面讲述的案例大部分是通过View的onDraw()来绘制view外观,没有考虑view的测量部分。本篇我们就来重点关注下view的测量。 自定义view是要关注三个方法的重写。 1,构造方法 // 在代码中创建组件时使用 Button btnOK = new Button(this) public FirstView(Context context) // 在layout布局文件中使用 public FirstView(Context context, AttributeSet att

u010869159的博客 783

不用买显示器!用USBMMID虚拟显示器软件在Win10上扩展4个屏幕(保姆级教程)

本文提供了一份详细的保姆级教程,指导用户如何在Windows 10系统上,无需购买额外硬件,通过USBMMID虚拟显示器软件扩展出多达4个虚拟屏幕。文章深入解析了虚拟显示器的核心原理,并基于微软IDD框架,手把手教学从软件获取、环境检查到安装配置的全过程,帮助开发者和多任务用户构建高效、免费的虚拟多屏工作站,实现生产力的飞跃。

backprop5master的博客 655

Flutter实战之封装一个LinearLayout

序 在APP开发过程中,经常遇到需要添加背景、设置边距、动态显示和隐藏某个组件。 但是在Flutter中,能同时具有添加背景、设置边距、阴影、边框、圆角的布局只有Container(参考我上一篇文章的介绍Flutter入门之Row、Column、Container布局),这个已经算是业务功能比较多的组件了,而要想实现组件的显示和隐藏则需要用到另外一个组件Offstage,水平的线性布局则需要用到组...

老胡 2962

Arxml文件可视化:当汽车软件架构遇见交互式设计工具

本文探讨了Arxml文件在汽车电子系统开发中的可视化技术,结合AUTOSAR架构标准,介绍了如何利用现代Web技术构建交互式设计工具。通过三维组件关系图、动态数据流展示和版本对比等功能,显著提升开发效率和架构评审质量,适用于MBD和ASPICE开发流程。

weixin_29050271的博客 427

Android封装layout作为自定义控件

1,选定自定义view的父类 如果是封装一个layout,可以直接继承对应的layout类型 2,使用inflate绑定对应的layout View inflate = inflate(getContext(), R.layout.custom_map, this); 3,使用inflate获取对应的子控件 mapView = (MapView) inflate.findVie...

王的备忘录 1168

磁编码器选型避坑指南:为什么MT6816比霍尔传感器更适合你的伺服系统?

本文深入对比了MT6816磁编码器与传统霍尔传感器在伺服系统中的应用。MT6816基于AMR技术,对磁场方向敏感而非强度,具备高精度、强抗干扰、高安装容差和极低延时等优势,尤其适合高转速、恶劣环境下的工业场景,能有效提升系统可靠性与长期稳定性。

rainy的博客 1102

【深度学习】肺结节分割项目实战二:分割肺实质

在后续训练模型的时候如果直接使用原始的肺部CT图像,其中的非肺区域会对训练造成干扰,因此我们需要提取分割肺实质。这一部分参考了kaggle上的教程。 从这张CT图像中可以看出扫描器以外的部分为黑色,背景和肺内部颜色较深,非肺组织和骨头颜色较浅。我们的目的是将肺部分割出来。由于肺部区域和其他部分对比明显,我们可以设置一个合适的阈值对图像中的区域进行隔离。 import argparse import os import numpy as np from medpy.filter.smoothing imp

weixin_42182906的博客 7240

重学 Android 自定义 View 系列(七):仿58同城加载动画

本文将实现早期58同城一个带有弹跳效果的加载动画,且结合图形变换(圆形变正方形、正方形变三角形等)实现一种动态、富有表现力的加载效果。一个很有意思的自定义View,在这篇文章中你可以学到到路径使用,安卓动画组合使用等知识。再会!

WriteBug001的博客 1105

通信算法之325:无人机云哨协议及发射机接收机仿真算法

【代码】通信算法之325:无人机云哨物理层协议及发射机接收机仿真代码。

leegang12的专栏 362

【5年Android从零复盘系列之七】Android自定义View(2):组合式详解(图文)

1.简述 顾名思义,即xml文件中根布局使用RelativeLayout(同理其他布局控件), 内部使用其他View控件,布局摆放,组合成XxxView的原始布局。 然后,Java类继承根布局标签对应的容器类,覆写构造函数,并初始化各子View的变量。 是最常用、最稳妥、不易产生过度绘制、内存泄漏等问题。 2. 实践 2.1 编辑 组合View的UI <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=

Cupster 5540

【灰度共生矩阵(GLCM)原理及代码实现】

文章主旨详细介绍灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)的生成原理、核心特征量及其在图像纹理分析中的应用,并提供了可运行的Python代码实现。该网页是一篇理论结合实践的优秀技术文章。它不仅清晰地解释了GLCM这一经典纹理分析工具背后的数学原理,还提供了完整、可复现的代码,非常适合计算机视觉或图像处理领域的学习者和开发者入门并实践灰度共生矩阵。读者可以通过运行代码来直观理解GLCM如何工作,并提取图像的纹理特征。

blotemj.blog.youkuaiyun.com 176

python点云可视化

Python三种点云可视化方案:mayavi、matplotlib、CloudCompare。

叶子的博客 1万+

一篇文章带你走近Android自定义view

系列文章目录 一篇文章带你走近Android自定义view 文章目录系列文章目录前言一、为什么要自定义view二、先看看一个超级简单的自定义view(三个构造函数)三、了解手机的坐标系四、使用Canvas画一个折线图(重写onDraw()方法)五、如何自定义属性,且在view中获取到属性的值(小提,在六中会有案例)六、绘制图案以及加入设置简单的动画(案例讲解很详细)七、自定义view的实现分类以及自定义组合控件的案例八、简单测量以及自定义接口实例来控制动画的更新计算表达式(onMeasure,TypeE

计蒙不吃鱼的博客 6026

SAP BOM反查(可追溯值至顶级)

功能介绍:BOM层数在7层以内的(含7层)的物料,执行后都可以查询到顶级的BOM,逻辑很简单,后期如BOM层数增加,可自行增加查询逻辑。 *&---------------------------------------------------------------------* *& Report ZBOM_CHECK *&---------------------...

SAP阿狸 6059

Android自定义View系列:布局自定义

1 布局基础 1.1 布局过程的含义 布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。 1.2 布局过程的工作内容 两个阶段:测量阶段和布局阶段。 测量阶段:从上到下递归地调用每个View或者ViewGroup的 measure() 方法,测量它们的尺寸并计算它们的位置 布局阶段:从上到下调用每个View或者ViewGroup的 layout() 方法,把测得的它们的尺...

Vincent的博客 1427

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

自定义view系列aige的博客

自定义view系列1 起步 http://blog.youkuaiyun.com/aigestudio/article/details/41316141#comments 自定义view系列2 Paint 方法介绍大全http://blog.youkuaiyun.com/aigestudio/article/details/41316141#comments LightingColorFilter (int

q178266871的专栏 897

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android自定义View系列之实战

public class CommonTitleBarLayout extends LinearLayout { public CommonTitleBarLayout(Context context) { this(context, null); } public CommonTitleBarLayout(Context context, @Nullable AttributeSet attrs) { this(context, attrs, .

sunbinkang的博客 2094

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android自定义View全解

源码在这里:优快云本文主要有以下内容: * 自定义View的分类 * 自定义View的注意事项 * 自定义View的实现 * 自定义View使其支持wrap_content和padding * 自定义属性的实现过程首先,自定义View是为了达到更绚丽的效果。它相对来说也是一个比较难的技术体系,涉及到【View的层次结构】、【View事件分发机制】、【View的工作原理】、【View的弹性

jasonpeak的专栏 5586

View与自定义View

View类是Android中各种组件的基类(如View是ViewGroup基类)。View表现为显示在屏幕上的各种视图,Android中的UI组件都由View、ViewGroup组成。它定义了所有UI组件共有的特性和行为(绘制、事件处理、状态变化……)。自定义View在没有现成的View,需要自己实现的时候,就使用自定义View。一般继承自View,SurfaceView或其他的View。自定义View主要是实现。自定义ViewGroup。

m0_60610120的博客 1201

156.自定义VIew-View的渲染之如何让自定义View显示出想要的模样

Measure 测量阶段在这个阶段,系统会调用 View 的方法。开发者可以通过重写来计算 View 的宽高(即测量尺寸)。测量阶段的核心在于调用measure()方法,并传入宽高规格(MeasureSpec)。Layout 布局阶段系统调用 View 的onLayout()方法,将测量得到的尺寸分配给 View 以及其子控件。对于普通的 View,这个阶段通常不会重写;而对于自定义 ViewGroup,则需要重写该方法,在子 View 之间进行位置布局。Draw 绘制阶段。

2303_79132118的博客 1041

Android自定义View注意事项

1.注意wrapcontent,自己写wrapcontent2.注意在ondraw中创建临时对象3.如果含有动画或者线程,需要在onDespatchedfromwindow 中取消,防止内存泄漏4.注意padding,让view支持padding,在onDraw方法中获取padding5.注意滑动冲突,解决滑动冲突6.尽量不要使用handler,因为里边已有post系列方法,不需要再用handler主要用于实现不规则的效果,即这种效果不方便通过布局的组合方式来实现。相当于就是得自己“画”了。

2401_85388599的博客 743
上一篇: 自定义View系列(六)
下一篇: 自定义View系列(八)
zdj_develop
博客等级 码龄11年 56粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值