当前位置: 首页 > wzjs >正文

企业网站建立费用 作什么科目重庆网站推广专家

企业网站建立费用 作什么科目,重庆网站推广专家,wordpress主题修改颜色教程,北京网页制作设计培训前言 本文是自定义view中最简单的使用方法,分别进行 ‘onMeasure’、‘onDraw’、‘自定义样式’、‘lifecycle’的简单使用,了解自定义view的使用。 通过lifecycle来控制 动画的状态 一、onMeasure做了什么? 在onMeasure中获取view 的宽和…

前言

 本文是自定义view中最简单的使用方法,分别进行 ‘onMeasure’、‘onDraw’、‘自定义样式’、‘lifecycle’的简单使用,了解自定义view的使用。

通过lifecycle来控制 动画的状态

一、onMeasure做了什么?

在onMeasure中获取view 的宽和高 是 ‘0’

 测量View的宽 / 高
  • 在某些情况下,需要多次测量(measure)才能确定View最终的宽/高;
  • 该情况下,measure过程后得到的宽 / 高可能不准确;
  • 此处建议:在layout过程中onLayout()去获取最终的宽 / 高
 必须要了解 MeasureSpec 作用

测量规格(MeasureSpec)是由测量模式(mode)和测量大小(size)组成,共32位(int类型),其中:

  • 测量模式(mode):占测量规格(MeasureSpec)的高2位;
  • 测量大小(size):占测量规格(MeasureSpec)的低30位。

MeasureSpec类用一个变量封装了测量模式(mode)和测量大小(size):通过使用二进制,将测量模式(mode)和测量大小(size)打包成一个int值,并提供了打包和解包的方法,这样的做法是为了减少对象内存分配和提高存取效率。具体使用如下所示:

 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)val widthModel = MeasureSpec.getMode(widthMeasureSpec)val widthSize = MeasureSpec.getSize(widthMeasureSpec)val heightModel = MeasureSpec.getMode(heightMeasureSpec)val heightSize = MeasureSpec.getSize(heightMeasureSpec)
//        @TODO 在 onMeasure 中获取view的 宽高 获取到是 0Log.e(TAG, "onMeasure: ${widthSize}-${width}__${heightSize}__${height}")val defWidth = 400val defHeight = 400
//        @TODO MeasureSpec.AT_MOST:wrap_content ; MeasureSpec.EXACTLY:match_parent ;if (widthModel == MeasureSpec.AT_MOST && heightModel == MeasureSpec.AT_MOST) {setMeasuredDimension(defWidth, defHeight)} else if (widthModel == MeasureSpec.AT_MOST) {setMeasuredDimension(defWidth, heightSize)} else if (heightModel == MeasureSpec.AT_MOST) {setMeasuredDimension(widthSize, defHeight)}}

2、onLayout 做了什么

计算位置,里面包含子view 的情况下才会用到这个函数

一般继承自viewGroup或者重新写layout布局

3、onDraw 做了什么

绘制View自身,设置padding 时要在onDraw中计算

1. 绘制view背景
2. 绘制view内容
3. 绘制子View
4. 绘制装饰(渐变框,滑动条等等)

  override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)canvas?.let {val pL = paddingLeftval pR = paddingRightval pT = paddingTopval pB = paddingBottomvar mHeight = height - pT - pBvar mWidth = width - pL - pRval cy = pT.plus(pB).div(2) + mHeight.div(2).toFloat()val cx = pL.plus(pR).div(2) + mWidth.div(2).toFloat()val cc = Math.min(mHeight, mWidth).div(2).toFloat()it.drawCircle(cx,cy,cc,mPaint)}}

4、lifecycle控制动画的状态

自定义view 继承 DefaultLifecycleObserver 类 然后实现  生命周期=中的方法override fun onStart(owner: LifecycleOwner) {super.onStart(owner)animSetColor.start()}override fun onDestroy(owner: LifecycleOwner) {super.onDestroy(owner)animSetColor.cancel()}override fun onPause(owner: LifecycleOwner) {super.onPause(owner)animSetColor.pause()}override fun onResume(owner: LifecycleOwner) {super.onResume(owner)animSetColor.resume()}在Act中 进行生命周期监听的绑定lifecycle.addObserver(customView)

5、代码示例

自定义View代码

/*** @TODO 自定义view***/
class MyView(context: Context?, attrs: AttributeSet?) :View(context, attrs), DefaultLifecycleObserver {private val mPaint by lazy { Paint() }private val TAG = "MyView"private var i = 0//  @TODO 动画实现改变颜色  然后 通过  lifecycle 控制动画的状态:开始、暂停、恢复、取消private val animSetColor by lazy {ValueAnimator.ofInt(0, 100).apply {addListener(object : AnimatorListener {override fun onAnimationStart(animation: Animator) {}override fun onAnimationEnd(animation: Animator) {}override fun onAnimationCancel(animation: Animator) {}override fun onAnimationRepeat(animation: Animator) {i++if (i % 2 == 0) {mPaint.color = android.graphics.Color.BLUE}mPaint.color = when (i % 5) {0 -> android.graphics.Color.BLUE1 -> android.graphics.Color.YELLOW2 -> android.graphics.Color.CYAN3 -> android.graphics.Color.MAGENTA4 -> android.graphics.Color.LTGRAYelse -> android.graphics.Color.TRANSPARENT}
//                    @TODO 每次设置颜色后 调用postInvalidate 重新绘制ViewpostInvalidate()}})
//            动画无线循环执行repeatCount = ValueAnimator.INFINITE
//            间隔一秒执行一次duration = 1000}}init {mPaint.color = Color.Blue.hashCode()mPaint.style = Paint.Style.FILLmPaint.strokeWidth = 20fcontext?.obtainStyledAttributes(attrs, R.styleable.MyView)?.apply {mPaint.color = getColor(R.styleable.MyView_circlr_color, android.graphics.Color.GREEN)recycle()}}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)val widthModel = MeasureSpec.getMode(widthMeasureSpec)val widthSize = MeasureSpec.getSize(widthMeasureSpec)val heightModel = MeasureSpec.getMode(heightMeasureSpec)val heightSize = MeasureSpec.getSize(heightMeasureSpec)
//        @TODO 在 onMeasure 中获取view的 宽高 获取到是 0Log.e(TAG, "onMeasure: ${widthSize}-${width}__${heightSize}__${height}")val defWidth = 400val defHeight = 400
//        @TODO MeasureSpec.AT_MOST:wrap_content ; MeasureSpec.EXACTLY:match_parent ;if (widthModel == MeasureSpec.AT_MOST && heightModel == MeasureSpec.AT_MOST) {setMeasuredDimension(defWidth, defHeight)} else if (widthModel == MeasureSpec.AT_MOST) {setMeasuredDimension(defWidth, heightSize)} else if (heightModel == MeasureSpec.AT_MOST) {setMeasuredDimension(widthSize, defHeight)}}
//挂在到Act上时
//    override fun onAttachedToWindow() {
//        super.onAttachedToWindow()
//        Log.e(TAG, "onAttachedToWindow: ")
//        anim.start()
//    }//在Act 销毁时
//    override fun onDetachedFromWindow() {
//        super.onDetachedFromWindow()
//        Log.e(TAG, "onDetachedFromWindow: ")
//        anim.cancel()
//
//    }override fun onStart(owner: LifecycleOwner) {super.onStart(owner)animSetColor.start()}override fun onDestroy(owner: LifecycleOwner) {super.onDestroy(owner)animSetColor.cancel()}override fun onPause(owner: LifecycleOwner) {super.onPause(owner)animSetColor.pause()}override fun onResume(owner: LifecycleOwner) {super.onResume(owner)animSetColor.resume()}override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {super.onLayout(changed, left, top, right, bottom)Log.e(TAG, "onLayout: ")}/*** 作用:根据给定的 Canvas 自动渲染View包括其所有子 View)。* 绘制过程:*   1. 绘制view背景*   2. 绘制view内容*   3. 绘制子View*   4. 绘制装饰(渐变框,滑动条等等)* 注:*    a. 在调用该方法之前必须要完成 layout 过程*    b. 所有的视图最终都是调用 View 的 draw()绘制视图( ViewGroup 没有复写此方法)*    c. 在自定义View时,不应该复写该方法,而是复写 onDraw(Canvas) 方法进行绘制*    d. 若自定义的视图确实要复写该方法,那么需先调用 super.draw(canvas)完成系统的绘制,然后再进行自定义的绘制*/override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)canvas?.let {val pL = paddingLeftval pR = paddingRightval pT = paddingTopval pB = paddingBottomvar mHeight = height - pT - pBvar mWidth = width - pL - pRval cy = pT.plus(pB).div(2) + mHeight.div(2).toFloat()val cx = pL.plus(pR).div(2) + mWidth.div(2).toFloat()val cc = Math.min(mHeight, mWidth).div(2).toFloat()it.drawCircle(cx,cy,cc,mPaint)}}
}
自定义View的xml样式文件
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="MyView"><attr name="circlr_color" format="color"/></declare-styleable>
</resources>
layout布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#11008811"tools:context=".CustomViewActivity"><com.andriod.police.view.MyViewandroid:id="@+id/customView"android:layout_width="wrap_content"android:layout_height="130dp"android:background="#11f08811"app:circlr_color="@color/cardview_light_background"android:padding="20dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
Act
class CustomViewActivity : AppCompatActivity() {private val customView: MyView by lazy { findViewById(R.id.customView) }override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_custom_view)
//        @TODO 通过  lifecycle 控制动画的状态:开始、暂停、恢复、取消lifecycle.addObserver(customView)}
}

总结

 在自定义View中了解在 onMeasure中进行view 的测量,在onLayout中进行对view位置的控制,在onDraw中进行view的绘制。

通过 lifecycle控制view的生命周期,防止出现内存泄露问题如在相应的生命周期中操作动画的执行状态

http://www.dtcms.com/wzjs/504541.html

相关文章:

  • 找淘宝帮建设网站靠谱吗免费广告制作软件
  • 用老域名做新网站私域流量运营管理
  • 竭诚网络网站建设开发seo优化工作内容
  • 企业网站怎么做连接googlechrome浏览器
  • 浙江网站建设哪里好品牌运营方案
  • 网站做多少屏合适小程序推广赚佣金平台
  • 做外贸网站一般多少钱免费加客源
  • a设计网站有哪些买外链
  • 福州定制网站开发制作国内seo排名分析主要针对百度
  • 做义工的同城网站湘潭网络推广
  • 浙江华企 做网站怎么样苹果被曝开发搜索引擎对标谷歌
  • 郴州网站建设公司官网5188大数据官网
  • 网站开发技术服务协议网站更换服务器对seo的影响
  • 申请做网站、论坛版主做排名优化
  • 做网站需要哪些东西黑帽seo排名技术
  • wordpress 已登录用户登录太原百度推广排名优化
  • emblog与wordpress优化设计六年级上册语文答案
  • 常宁网站设计软文代写平台有哪些
  • wordpress怎么找模板seo关键词排名教程
  • 宁波网站搭建公司定制网页加速器
  • 番禺南村网站建设百度收录检测
  • 如何制作公司网站和网页爱站网关键词查询系统
  • 网站项目有需要什么技术支持搜索seo优化托管
  • 品牌网站建设c股j东大蝌蚪常用的营销方法和手段
  • 福彩网站开发天津seo方案
  • 小公司网站建设费用网站托管服务商
  • 做面包的网站考研培训机构排名前十
  • 江门市智企互联网站建设seo整站优化解决方案
  • 免费咨询律师电话seo快速排名上首页
  • 怎么再贴吧给自己的网站做宣传网页制作软件dreamweaver