当前位置:主页 > 查看内容

Android自定义控件实现

发布时间:2021-07-13 00:00| 位朋友查看

简介:代码示例见 神秘的gitHub链接 (/view/widget包下均为自定义控件 View绘制过程 继承自View类的控件在绘制中分为三个主要过程 Measure 在这一阶段确定控件的大小应对不同specModel采取不用策略 protected void onMeasure(int widthMeasureSpec, int heightMeas……

代码示例见 神秘的gitHub链接 (/view/widget包下均为自定义控件


View绘制过程

继承自View类的控件在绘制中分为三个主要过程

Measure

在这一阶段确定控件的大小,应对不同specModel采取不用策略

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
一般直接调用super.onMeasure(widthMeasureSpec,heightMeasureSpec)就可以了。如果不能达到预期效果,就需要先了解一下class#MeasureSpec
在onMeasure函数传入的两个int并不单纯是view的width和height,只有30位用于记录数值,高二位记录specModel 大概,反正不全是用来计数的 。specModel有如下三种,以height属性为例:

  • EXACTLY
    在layout_height为 具体数值 or match_parent时生效
  • AT_MOST
    在layout_height为wrap_content时生效。表示view尺寸为不超过父视图最大尺寸的任意大小
  • UNSPECIFIED
    不指定大小,父视图不限制子视图的大小

在确定view的height和width之后,调用setMeasuredDimension(width,height);为view设定大小,否则不会生效。

onLayout

确定view左上位置 具体作用不明,用到再更

onDraw

这一过程负责绘制你的CustomView,也是实现动画效果的关键部分。根据计时器数指计算参数,调用invalidate()不断刷新控件实现动画。
示例:仿华为天气:日出日落动画效果

三者调用关系如下图

在这里插入图片描述

自定义属性

声明属性

如果需要额外的信息来配置自定义控件,可以在res/value资源文件下新建Resource File

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<declare-styleable name="自定义控件类名">
		<attr name="自定义属性名称" format="属性格式">
	</declare-styleable>
</resources>

构造函数

现在仅定义属性我们还无法在控件加载时获取,获取还需要写构造函数。
关于构造函数有如下三种重载函数

  • public CustomView(Context context)
    在代码中动态为页面动态添加时调用构造器,需要配合setter配置属性

  • public CustomView(Context context, @Nullable AttributeSet attrs)
    从xml文件中构造控件时调用的构造器,获取属性方法如下

    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.yourCustomViewClassName);
    if (typedArray!=null){
    	 int color = typedArray.getInt(R.styleable.declare_attr , defValue);
    	 // 注意String类型没有默认值,如果xml文件中没有配置获取为null
    	 String text = typedArray.getString(R.styleable.declare_attr);
    	 // 获取dimension类型时,默认值单位为px
    	 float width = typedArray.getDimension(R.styleable.declare_attr, defValue);
    	 
    	 typedArray.recycle();
    }
    
  • public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
    从xml中构造控件且使用theme attr style时调用。大概用不到,用到再更

动画效果

这里仅对Android Anime效果做简单概述

帧动画

实现较为简单但是由于不会画图所以从来没有试过

  • 在res/drawable资源文件下新建xml,root为 animation-list
  • 将帧动画的每一帧按序添加,设置持续时间duration
  • 更改需要动画效果的activity/fragment的background
  • AnimationDrawable drawable =activity/fragment id.getBackground();drawable.start()开始动画;drawable.stop()停止动画

补间动画

补间动画有四种动画效果:alpha 透明度 / rotate 旋转 / scale 缩放 / translate 平移
配置补间动画需要在res/anim资源文件夹下新建Animation Resource File。配置属性见开发文档,下面以alpha示例

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.8"
    android:toAlpha="1"
    android:duration="3000"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">

</alpha>

页面布局

    <ImageView
        android:id="@+id/background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="bg pic"/>
bg = findViewById(R.id.background);
Animation animation = AnimationUtils.loadAnimation(SplashActivity.this,R.anim.yourResoucreFileName);
animation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    //动画开始时回调函数
    }

    @Override
    public void onAnimationEnd(Animation animation) {
    //动画结束后回调函数
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    //动画重复时回调函数
    }
});
bg.startAnimation(animation);

属性动画

示例:仿华为天气:日出日落动画效果

;原文链接:https://blog.csdn.net/white_156/article/details/114643427
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:Android UI:RecyclerView 悬浮Item实现 下一篇:没有了

推荐图文


随机推荐