首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >安卓自定义 View 启航

安卓自定义 View 启航

作者头像
acc8226
发布2022-06-19 14:08:44
发布2022-06-19 14:08:44
5470
举报
文章被收录于专栏:叽叽西叽叽西

先总结下自定义 View 的步骤:

  1. 自定义 View 的属性
  2. 在 View 的构造方法中获得我们自定义的属性
  3. [重写 onMeasure]
  4. 重写 onDraw

我把3用[]标出了,所以说3不一定是必须的,当然了大部分情况下还是需要重写的。

  1. 自定义 View 的属性,首先在 res/values/ 下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="titleText" format="string" />
    <attr name="titleTextColor" format="color" />
    <attr name="titleTextSize" format="dimension" />

    <declare-styleable name="CustomTitleView">
        <attr name="titleText" />
        <attr name="titleTextColor" />
        <attr name="titleTextSize" />
    </declare-styleable>

</resources>

format是值该属性的取值类型: string, color, demension, integer, enum, reference, float,boolean, fraction, flag;不清楚的可以google

自定义View之基础概念之用到的六个工具

  • Configuration
  • ViewConfiguration 提供了一些自定义控件用到的标准常量, 比如UI超时, 尺寸大小, 滑动距离, 敏感度等等
  • GestureDetector 简化Touch操作
  • VelocityTracker 用于跟踪触摸屏事件(比如: Flingling以及其他手势事件)的速率
代码语言:javascript
复制
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(MotionEvent event);

// 获取1000毫秒内运行的像素
mVelocityTracker.computeCurrentVeleocity(1000)

// 获取1S内 X 方向上移动的像素
mVelocityTracker.getXVelocity()

// 最后记得释放
mVelocityTracker.recycle()
  • Scroller scrollBy() 内部还是调用了scrollTo() scrollTo() 和 scrollBy()

mTextView.scrollTo(0, 25)

  • ViewDragHelper 简化View的拖拽操作
代码语言:javascript
复制
ViewDragHelper mViewDragHelper = ViewDragHelper.create(context, 1.0f, new ViewDragHelper.Callback(){
    clampViewPositionHorizontal(View child, int left, int dx)
    clampViewPositionVertical(View child, int left, int dx)
    onViewDragStateChanged(int state){
      ViewDragHelper.STATE_DRAGGING:
      ViewDragHelper.STATE_IDLE:
      ViewDragHelper.STATE_SETTLING:
    }
}

然后代理两个方法

```java
public boolean onINterrceptTouchEvent(MotionEvent ev) {
  return mViewDragHelper.shouldInterceptTouchEvent(ev);
}

public boolean onTouchEvent(MotionEvent ev) {
  mViewDragHelper.processTouchEvent(ev);
  return true;
}
代码语言:javascript
复制
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

int measureSpec = MeasureSpec.makeMeasureSpec(size, mode);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 自定义View之基础概念之用到的六个工具
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档