自定义View和控件

控件
  1. 把已经存在的控件组合在一起当做一个控件来用
自定义View
  1. 创新 ,之前没有的控件
源码的关联
  1. 删除private jar
  2. 添加到build path
  3. 选中jar包的可用
  4. 选中源码路径I:\adtbundlewindows64\sdk\extras\android\support\v4\src
ViewPager的用法
  1. (View)ViewPager的样子,添加到布局文件中

  2. (Data)展示数据

    1. 适配器 PagerAdapter

      1. ViewPager 首先调用适配器的getCount方法,来确定展示多少条数据
        @Override
        public int getCount() {
        //BaseAdapter getCount();
        return 0;
        }
      2. 传递位置初始化数据 (0 ,1) ViewPager默认缓存3个页面 当前,前一个,后一个
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
        // TODO Auto-generated method stub
        return super.instantiateItem(container, position);
        }

      3. isViewFromObject 取
        @Override
        public boolean isViewFromObject(View view, Object object) {
        // TODO Auto-generated method stub
        return false;
        }

      4. View的清理 除了当前,前一个,后一个 都有进行清理的操作
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
        // TODO Auto-generated method stub
        super.destroyItem(container, position, object);
        }

    2. 容器List
优酷菜单(控件)
  1. setFocusableInTouchMode(true);//触摸模式为true
    封装组件的时候,在view类中调用上面方法,可以让手机按键事件相应
下拉列表框
  1. 界面

    1. EditText
    2. 箭头按钮
    3. PopupWindow—> ListView
      1. pw_numbers.setFocusable(true);//获取焦点
        //设置透明背景
        pw_numbers.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        pw_numbers.setOutsideTouchable(true);//pw 外部点击关闭
自定义View
  1. 开关
View的绘制流程

复习

  1. ViewPager

    1. adapter

      1. PagerAdapter1. getCount2. isViewFromObject3. instantiateItem4. destroyItem
      
    2. event

      1. OnPageChangeListener1. onPageSelected  页面静止回调2. onPageScrolled  滑动监听3. onPageScrollStateChanged 状态
      
  2. Uku菜单

    1. 补间动画

      1. 影子动画 位置还在(写组件事件,注意组件是否可用)
    2. 封装成一个View 如果相应按键事件
      1. setFocusableInTouchMode(true);//触摸模式为true
  3. Spinner下拉列表框

    1. 组件的getWidth
    2. getLayoutParameter width
    3. measure getMeasureWidth
  4. Toggle开关(第一个自定View)
SlidingMenu
  1. 实现布局

    1. left

      1. ScrollView1.  android:fillViewport="true" 让LinearLayout填充父窗体2.  android:scrollbars="none" 取消掉滑块显示
      
    2. main
  2. 创建ViewGroup的子类,添加上面两个子View

    1. 获取连个子控件

      1. protected void onFinishInflate() 布局完成的回调
    2. 测量 覆盖 onMeasure

    3.     MeasureSpec 带模式测量的类// 1. 测量左侧菜单// int 32 位// 31 32位测量模式// UNSPECIFIED 随意 00 30个0// EXACTLY 精确 01 30个0// AT_MOST 指定最大值 10 30个0// 后30位 大小// 精确测量 测量出宽度// 模式= 模式(前2位) + 宽度(30)// 模式 EXACTLY 宽度:mLeft_View_Widthint leftView_widthMeasureSpec = MeasureSpec.makeMeasureSpec(mLeft_View_Width, MeasureSpec.EXACTLY);// 带模式的值left_View.measure(leftView_widthMeasureSpec, heightMeasureSpec);// 2. 测量内容content_View.measure(widthMeasureSpec, heightMeasureSpec);// 3.设置大小// 把widthMeasureSpec 的模式值去掉setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),MeasureSpec.getSize(heightMeasureSpec));
      
      1. layout

        // 摆放content的位置int dis = 0;
        int left = 0 + dis;
        int top = 0;
        int right = content_View.getMeasuredWidth() + dis;
        int bottom = content_View.getMeasuredHeight();
        content_View.layout(left, top, right, bottom);// 摆放左侧菜单位置
        int lv_left = -left_View.getMeasuredWidth() + dis;
        int lv_top = 0;
        int lv_right = 0 + dis;
        int lv_bottom = left_View.getMeasuredHeight();left_View.layout(lv_left, lv_top, lv_right, lv_bottom);
        
      2. 触摸事件

        @Overridepublic boolean onTouchEvent(MotionEvent event) {// 处理拖动事件switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 按下mDownX = event.getX();break;case MotionEvent.ACTION_MOVE:// 拖动float moveX = event.getX();//取反方向 int dx = Math.round(mDownX - moveX);// 四舍五入// 移动屏幕// scrollTo(20,0) 移动那个位置 绝对坐标 移动到20(横坐标)的位置// scrollBy(20, 0) 移动的相对位置 往右移动20个像素// 判断 拖动的位置是否越界int scrollX = getScrollX();// 获取屏幕的x坐标if (scrollX + dx < -left_View.getMeasuredWidth()) {// 左边界scrollTo(-left_View.getMeasuredWidth(), 0);} else if (scrollX + dx > 0) {//右边界scrollTo(0, 0);} else {scrollBy(dx, 0);}// 变成起点坐标mDownX = moveX;break;default:break;}return true;}
        
      3. 屏幕移动动画

        1. //移动动画的方法
          mScroller.startScroll(startX, startY, dx, dy, duration);
        2. invalidate 触发
          绘制 draw dispatchDraw child.draw(,,) computeScroll
        3. computeScroll

             //处理坐标的变化if (mScroller.computeScrollOffset()) {//计算中int currX = mScroller.getCurrX();// 把屏幕移动的到currX位置scrollTo(currX, 0);invalidate();//触发draw方法}
          
事件机制
  1. dispatchTouchEvent

    1. 事件的分发
  2. onInterceptTouchEvent
    1. 事件的拦截
  3. onTouchEvent
    1. 事件的处理
ViewDragHelper
  1. 事件处理

    1. tryCaptureView 返回true 分析child
    2. clampViewPositionHorizontal child横向拖动的分析 处理自己的位置
    3. onViewPositionChanged 监听位置改变的回调 处理其他子控件的位置
  2. 移动动画

自定义View和控件相关推荐

  1. 自定义 View 歌词控件

    Yuan-LrcView 项目地址:jsyjst/Yuan-LrcView 简介: 自定义 View 歌词控件 更多:作者   提 Bug 标签: 简约风的歌词控件,如果对具体实现感兴趣的可以看这篇文 ...

  2. 【Android】自定义View和控件时出现Binary XML file line #报错行数: Binary XML file line #9: Error inflating class 类路径

    方法一: 原因:自定义视图.控件的的那个类继承了View或其它布局类的时候没有实现所有的构造方法. 错误写法: 正确写法: 方法二: 原因:参数不匹配 在attrs文件上写的是: <attr n ...

  3. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  4. android自定义控件几种,Android 自定义View一个控件搞定多种水波纹涟漪扩散效果 - CSDN博客...

    效果图 实现思路 这个效果实现起来并不难,重要的是思路 此View满足了多种水波纹涟漪扩散效果,这要求它能满足很多的变化 根据上面的样式,可以看出此View需要满足以下变化 圆圈从中心可循环向外扩散 ...

  5. 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距...

    [Android自定义View实战]之自定义评价打分控件RatingBar,可以自定义星星大小和间距

  6. Angular19 自定义表单控件

    1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...

  7. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面...

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  8. WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...

  9. Android在Activity中动态增加xml自定义样式布局控件(引用xml布局文件和循环增加控件)

    工程目录: MainActivity package com.example.test1121;import androidx.appcompat.app.ActionBar; import andr ...

最新文章

  1. 关于ListView中adapter调用notifyDataSetChanged无效的原因
  2. Django搭建简单的站点
  3. python3d动态图-Python图像处理之gif动态图的解析与合成操作详解
  4. Nginx服务测试时的一些配置:wireshark、常用搜索URL格式、关闭防火墙、siege
  5. 硬核图解,再填猛将!
  6. 数据结构与算法-----冒泡排序
  7. python 将数组转化8位整数_int对象,永不溢出的整数
  8. 一个软件工程师的职业规划
  9. 即时通讯软件几个主要下载分类
  10. Thinkpad T61/R61/X61安装XP驱动流程
  11. http 返回的状态码以及含义
  12. 大数据怎样帮助运维工程师实现无死角监控?
  13. matlab 和 ampl 结合,AMPL和MATLAB结合使用示例
  14. bcrypt加密工具
  15. 数据可视化平台-智慧安防可视化管理系统-解决楼宇监控管理难题
  16. 国内外9大最佳测试管理平台
  17. 【Python】利用Python爬虫实现网页图片批量下载
  18. 【程序源代码】微信小程序商城,微信小程序微店
  19. Qtablewidget设置某一列不可编辑
  20. 记一次使用Cobar踩到的坑

热门文章

  1. Deep Learning of Binary Hash Codes for Fast Image Retrieval
  2. 计算机c盘和u盘区别,用U盘进入pe后C盘被占用怎么办|C盘盘符被U盘占用解决方法...
  3. XSS-11注入靶场闯关(小游戏)——第十一关
  4. ad16怎么画弧线_手把手教你用GraphPad Prism绘制生存曲线
  5. 六一双倍的快乐:ggplot2绘制双y轴图
  6. 爬虫“入侵”王者六周年,拿来吧你
  7. 一年一折腾,今年二折腾
  8. 分布式事务:深入理解什么是2PC、3PC及TCC协议
  9. 【Java基础面试】10道不得不会的Java基础面试题
  10. 博主:遇见未知的自己 (http://www.cnblogs.com)