OnDragListenerOnDragListener 是 Android framework 提供的 API,不需要引用额外的库。它有几个默认的特性:拖动时原始 View 照常在原位置显示。拖动时会有一个半透明的浮层,全局置顶,甚至可以覆盖系统 UI(比如导航栏)。与 OnDragListener 配套的是 View.startDrag() 方法或 ViewCompat.startDra...
OnDragListenerOnDragListener 是 Android framework 提供的 API,不需要引用额外的库。它有几个默认的特性:拖动时原始 View 照常在原位置显示。拖动时会有一个半透明的浮层,全局置顶,甚至可以覆盖系统 UI(比如导航栏)。与 OnDragListener 配套的是 View.startDrag() 方法或 ViewCompat.startDra...
默认图片居中,以 CENTER_INSIDE 的方式显示。双击缩放,放大到比 CENTER_CROP 略大。要适配双击的位置。放大后可以滑动显示。支持捏撑手势缩放这是一个 Demo 性质的项目,不会处理细节问题。代码比较简单,就不上传完整源码了,主要记录各个需求实现的思路。图片居中显示这个需求没什么好说的,注意一下计算缩放倍数的时候要考虑图片与 View 的长宽比。通常算法如下:if (w....
顾名思义,测量与布局是两个分开的流程。首先从根 View 开始递归调用子 View 的 measure() 方法来测量。然后再从根 View 开始递归逐级调用子 View 的 layout() 方法来布局。此时会把测量的结果,即子 View 的位置与尺寸传递过去,子 View 需要保存这些属性。为什么要把测量与布局分开?因为测量不是可以一次就完成的,部分情况下需要两次甚至更多。例如 Line...
本质与区别Bitmap 本质上是一个位图数据,它只是单纯地存储一张图片,仅此而已。Drawable 这是一个上层的绘制工具,有点类似 View,可以调用 Canvas 进行绘制。但 View 还承担布局、测量等工作,Drawable 就轻量多了,只负责绘制。Drawable 默认没有颜色信息,甚至连大小都没有,所以记得先设置大小后再进行绘制,然后才有了像素数据。比如:canvas.drawB...
属性动画是 Android 中最基本最简单最方便的动画,自然也是限制最多的一种。它仅能使用几种内置的方式进行变换,包括:平移、缩放、透明度、旋转,没了。允许使用插值器(非线性动画)。ViewPropertyAnimator 的使用非常简单:view.animate() // 返回一个 ViewPropertyAnimator 对象 .translationX(200.dp) .rot...
既然标题叫「高级绘制」,对于那些比较基本的简单的方法这里就不赘述了。Paint路径效果比如我们要绘制一个仪表盘:不难看出由三部分组成:边框、刻度、指针。其中边框与指针都可以比较轻松地画出来,但刻度缺比较头疼。有一个粗暴的办法:自己用三角函数计算每一格的起止坐标,套一个 for 循环绘制,但这样费时费力而且效率也比较低。Paint.pathEffect 专门用于这种需求,它有点类似 PS 中的...
准备解锁 Bootloader显然,万物基于解锁。Pixel 对于解锁是非常开放的~手机设置 - 关于手机 - 版本号 <- 狂点它激活开发者选项手机设置 - 系统 - 开发者选项:开启 「OEM 解锁」以及「USB 调试」。重启到 fastboot 模式(执行 adb reboot bootloader)后执行:fastboot flashing unlock此时手机屏幕会出现题提示...
嵌入显示Viwe 中嵌入 Compose乍一看这活挺复杂的,其实很简单。首先在传统 View 里加一个 ComposeView 作为 Compose 的容器:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.a...