Android自定义view_由浅入深_01_屏幕与坐标系统

第一章:屏幕与坐标系统

屏幕基本概率


我们常说的ldpi,hdpi,xhdpi是指系统密度,安卓对界面缩放的依据正是这个数据,对应关系如下:

这里写图片描述


在Android中,规定以160dpi为基准,1dip=1px,根据这张图的dp px转换比率,我们可以计算出各屏幕密度的转换公式
160dpi : 1dip = 1 (px)
240dpi : 1dip = 4/6 (px)
320dpi : 1dip = 4/8 ( px )


dp与px转换公式为:
px = dp * (dpi / 160) 这里的dpi为系统密度, 其值可以通过DisplayMetrics获得
dp = px / (dpi /160)


在实际开发过程中,UX如果针对1080 * 1920分辨率的屏幕 画了一个300px宽的组件,那在480 * 800分辨率的屏幕中,这个组件的宽度是多少?
解:在1080 * 1920分辨率的屏幕中 300px宽,其dp = 300 / (480/160) = 100dp
则在 480 800分辨率的屏幕中,组件的宽 100 (240 / 160) = 150px


在屏幕适配中的解决方案

  • 在res目录建立不同的drawable和layout,如图
  • 屏幕适配建立drawable
  • 在不同的layout里面,我们可以针对不同的分辨率写布局文件,但是这样会增加apk大小,因此我们可以values文件中建立demens.xml,在这个文件中写入不同的值用于适配分辨率,如图demens屏幕适配

一:屏幕坐标系统
这里写图片描述

在坐标系统里面有几个常用函数

getRawX(),getRawY()就是以这个坐标系获得的坐标值

二:View的坐标系统
这里写图片描述
该图中,我们可以看到当触发View的点击事件的时候,各个函数的坐标值的参照物

getTop :获取到的,是view自身的顶边到其父布局顶边的距离
getLeft :获取到的,是view自身的左边到其父布局左边的距离
getRight :获取到的, 是view自身的右边到其父布局左边的距离
getBottom:获取到的, 是view自身的底边到其父布局顶边的距离

在触摸事件中
getX() :获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离
getY() :获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离
getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离
getRawY() :获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离


三:在滚动的时候的坐标系
android开发中,有一个常用的控件:Scroller,利用这个控件我们可以实现很多滑动特效,如窗帘效果,自定义listview的滚动方式。

  • Scroller效果的产生
    当屏幕内容显示超过当前屏幕时,即会产生scroller效果

  • 常用的函数

    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }
    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

这里的mScrollX、mScrollY表示偏移量,即视图初始位置的距离, scrollTo()方法就是将一个视图移动到指定位置,而srollBy则是直接调用了scrollTo方法,它是一个累加减的过程,不断的将当前视图内容继续偏移(x , y)个单位。比如第一次 scrollBy(10,10),第二次 scrollBy(10,10),那么最后的结果就相当于scrollTo(20,20)。然而scrollTo如果移动的点的坐标和上次偏移量一样,也就是说这次移动和上次移动的坐标是同一个,那么就没有必要进行移动了。这也是这个方法为什么进行 if (mScrollX != x || mScrollY != y) 这样一个判断的原因。


这样就带了一个效果,scrollby会超过屏幕,而scrollto不会

scrollTo(int x, int y)
当X > 0时,其滑动之后的效果如图(View显示的内容和X轴方向相反,此处将屏幕显示的内容进行了缩小处理,方便查看)
这里写图片描述
当Y > 0时,其滑动的方向正好与Y轴相反。

scroolBy(int x,int y)中的移动方向同scrollTo。

四:Camera的Z轴
Camera的坐标系为左手坐标系,Android设备平整的放在桌面上,X轴是手机的水平方向,Y轴是手机的竖直方向,Z轴是垂直于手机向里的那个方向。通过camera的围绕X,Y,Z轴的旋转,我们可以对View制作丰富的特效
这里写图片描述

  • camera位于坐标点(0,0),也就是视图的左上角;
  • camera.translate(10, 20, 30)的意思是把观察物体右移10,上移20,向前移30(即让物体远离camera,这样物体将会变小);
  • camera.rotateX(45)的意思是绕x轴顺时针旋转45度。举例来说,如果物体中间线和x轴重合的话,绕x轴顺时针旋转45度就是指物体上半部分向里翻转,下半部分向外翻转;
  • camera.rotateY(45)的意思是绕y轴顺时针旋转45度。举例来说,如果物体中间线和y轴重合的话,绕y轴顺时针旋转45度就是指物体右半部分向里翻转,左半部分向外翻转;
  • camera.rotateZ(45)的意思是绕z轴顺时针旋转45度。举例来说,如果物体中间线和z轴重合的话,绕z轴顺时针旋转45度就是指物体上半部分向左翻转,下半部分向右翻转;

五:Foucus系统
默认情况,系统会按照布局从上到下,从左到右的传递focus
那如何自定义focus传递?
解:通过以下属性设置:android:nextFocusDown=”@+id/button1”>用户如何自定义控件的焦点切换顺序,这对于用户界面的体验是很有好处的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值