Android开发 移动端适配
1 UI自适应(UGUI)
UI自适应又分为锚点自适应和缩放。锚点主要控制UI控件在父控件之中的位置,同时也能影响缩放。
锚点自适应缩放:
我们使用UGUI创建一个界面,设计使用1920x1080分辨率

在我们设计好,然后改变设计大小时,会发生意想不到的情况

这个时候我们可以使用锚点的自适应,在这里选择好缩放方法和设计尺寸

然后不管我们怎么缩放,都能够很好的适配

2 视口自适应(摄像机)
首先创建一个场景

然后我们改变视口大小,发现Unity的自适应做的很好,只不过它是优先保证高度看全,自动裁剪宽度上的东西


有的时候我们需要宽度看全,高度不需要。这个时候我们可以在摄像机上挂一个脚本来控制。
using UnityEngine;
public class CamearAdaptation : MonoBehaviour
{
    public float initOrthoSize;
    public float initWidth;
    public float initHeight;
    float factWidth;
    float factHeight;
	void Start ()
	{
        factWidth = Screen.width;
        factHeight = Screen.height;
        //实际正交视口 = 初始正交视口 * 初始宽高比 / 实际宽高比
        GetComponent<Camera>().orthographicSize = (initOrthoSize * (initWidth / initHeight)) / (factWidth / factHeight);
    }
}
3 Touch类介绍
下面的代码包含了Touch类的一些成员,然后使用这个做了一个手指追踪的小Demo和单手势识别的小Demo,还有返回键的操控权,以及双端通用的API
using UnityEngine;
using UnityEngine.UI;
public class TouchDemo : MonoBehaviour
{
    public GameObject effectPrefab;
    public Text infoText;
    GameObject markGo;
    string info;
    Vector2 touchOrigin;
    void Start()
    {
        // 这句代码表示使用Android的返回键直接退出App
        Input.backButtonLeavesApp = true;
    }
    void Update ()
	{
        // 返回键,点击Android的返回键会调用
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            info += "Escape\n";
        }
        //所有Touch类在PC端均不生效
        //每当一个手指触摸屏幕时,Unity都会为其生成一个Touch对象
        //Input.touchCount可以获取当前Touch对象的个数
        if (Input.touchCount > 0)
        {
            info = string.Empty;
            //以下三行在移动端也生效,带来方便的同时也会带来隐患
            info += "GetMouseButton(0) : " + Input.GetMouseButton(0) + "\n";
            info += "GetAxis(\"Mouse X\") : " + Input.GetAxis("Mouse X") + "\n";
            info += "GetAxis(\"Mouse Y\") : " + Input.GetAxis("Mouse Y") + "\n";
            info += "touchCount : " + Input.touchCount + "\n";
            //Unity会将当前存在的所有Touch对象放在Input.touches这个数组中
            //另一种方式获取指定Index的Touch对象:Input.GetTouch(index);
            Touch myTouch = Input.touches[0];
            //fingerId是用来识别当前手指的唯一标示
            info += "fingerId : " + myTouch.fingerId + "\n";
            //deltaPosition当前位置与上次位置之间的差
            info += "deltaPosition : " + myTouch.deltaPosition + "\n";
            //deltaTime本次记录Touch对象状态与上次记录Touch状态之间的时间差
            info += "deltaTime : " + myTouch.deltaTime + "\n";
            //Touch对象的生命周期的结束并不是手指离开屏幕后立刻销毁
            //如果一根手指在同一位置快速点击,则视作同一Touch对象
            //tapCount为Touch对象所对应的手指点击屏幕的次数
            info += "tapCount : " + myTouch.tapCount + "\n";
            //phase表示当前手指所对应的Touch对象的阶段(状态)
            info += "phase : " + myTouch.phase + "\n";
            //rawPosition为当前Touch对象所对应的手指的初始(刚按下时)屏幕坐标
            info += "rawPosition : " + myTouch.rawPosition + "\n";
            //position为当前Touch对象所对应的手指的屏幕坐标
            info += "position : " + myTouch.position + "\n";
            switch (myTouch.phase)
            {
                //当一个手指刚按下时,其对应的Touch对象的Phase是Began
                case TouchPhase.Began:
                    touchOrigin = myTouch.position;
                    markGo = Instantiate(effectPrefab, Camera.main.ScreenToWorldPoint(myTouch.position) + new Vector3(0, 0, 10), Quaternion.identity);
                    break;
                //当一个手指在屏幕上移动时,其对应的Touch对象的Phase是Moved
                case TouchPhase.Moved:
                //当一个手指在屏幕上按住不动时,其对应的Touch对象的Phase是Stationary
                case TouchPhase.Stationary:
                    markGo.transform.position = Camera.main.ScreenToWorldPoint(myTouch.position) + new Vector3(0, 0, 10);
                    break;
                //当一个手指离开屏幕时,其对应的Touch对象的Phase是Ended
                case TouchPhase.Ended:
                //当因为某些原因(系统原因)取消对某个手指的追踪时,其对应的Touch对象的Phase是Canceled
                case TouchPhase.Canceled:
                    if (touchOrigin.x >= 0 && touchOrigin.y >= 0)
                    {
                        Vector2 touchEnd = myTouch.position;
                        float x = touchEnd.x - touchOrigin.x;
                        float y = touchEnd.y - touchOrigin.y;
                        if (Mathf.Abs(x) > Mathf.Abs(y))
                        {
                            if (x > 0.25f)
                            {
                                info += "dir : Right\n";
                            }
                            else if (x < -0.25f)
                            {
                                info += "dir : Left\n";
                            }
                            else
                            {
                                info += "dir : Unknow\n";
                            }
                        }
                        else
                        {
                            if (y > 0.25f)
                            {
                                info += "dir : Up\n";
                            }
                            else if (y < -0.25f)
                            {
                                info += "dir : Down\n";
                            }
                            else
                            {
                                info += "dir : Unknow\n";
                            }
                        }
                    }
                    Destroy(markGo);
                    break;
                default:
                    break;
            }
        }
        infoText.text = info;
	}
}
4 虚拟摇杆
Unity官方自带了虚拟摇杆,但是我们使用Easy Touch 5这个插件来控制虚拟摇杆和触摸
Android开发 移动端适配的更多相关文章
- Android APP 多端适配
		Android APP 多端适配 传统的多终端适配方案,是为大尺寸 Pad开发一个特定的 HD版本. 但是目前支持 Android 系统的设备类型越来越丰富,不同类型的设备尺寸也越来越多样化,特定的H ... 
- web开发中移动端适配
		这个话题有些复杂,说起来有些琐碎,因为和移动端适配相关的问题太多了. 1. 概念 1.1 设备像素 设备像素被称为物理像素,它是显示设备中一个最小的物理部件.每个像素可以根据操作系统设置自己的颜色和亮 ... 
- android 开发对gif解码(适配android 4.2、4.3、4.4版本)
		android 开发对gif解码(适配android 4.2.4.3.4.4版本) 使用方法: public class ImageInputActivity extends Activity imp ... 
- Android开发——自动生成Android屏幕适配的dimens.xml文件
		使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ... 
- Android 开发中的屏幕适配技术详解
		本文主要介绍Android开发中比较头疼繁琐的一个问题-屏幕适配问题.主要从适配原因.基本核心概念.适配方法等方面介详细 介绍从而是的深入或者进一步对Android屏幕适配技术的掌握和理解. 真题园网 ... 
- 职业定位(移动端、ios开发、Android开发)
		移动端 移动端webapp开发必备知识:http://www.chinaz.com/manage/2012/1128/283974.shtml 设计一款好的移动App,有哪些基本规则?http://w ... 
- Python 制作Android开发 所需的适配不同分辨率的套图
		使用Python做起工具来还真是爽,简单,方便,快捷.今天忙活了一下,制作出一个比较实用的小工具. 自动化套图制作,适配不同屏幕 尤其是对于android开发来说,要适配不同屏幕就需要多套切图,那么. ... 
- android开发分辨率适配总结
		重要概念 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 什么是dp.dip.dpi.sp.px?他们之间的关系是什么? 什么是mdpi.hdpi.xdpi.xxdpi?如何计算和区分? 在下面的内容中我 ... 
- Android开发——Android手机屏幕适配方案总结
		)密度无关像素,单位为dp,是Android特有的单位 Android开发时通常使用dp而不是px单位设置图片大小,因为它可以保证在不同屏幕像素密度的设备上显示相同的效果. /** * dp与px的转 ... 
随机推荐
- curses is not supported on this machine:(curses 在pycharm(Windows)中的安装  )
			curse在Windows下的pycharm中安装,curse是不能直接在Windows下跑的.需要安装相关环境,要根据直接project的编译器版本来选择下载相关的whl. 找到project的Sc ... 
- 记录weblogic12c通用版本在windowsXP上安装报异常的问题:java.lang.NoClassDefFoundError:
			先上图: 这个可能有经验的人一眼就看出问题了,报这个错的原因是:我把安装包放在了中文目录下,本来以为安装包放在中文目录下无关紧要,但是weblogic12c就是这么神奇,不能放在中文目录下. 解决方法 ... 
- hive日期函数-Demo(二)
			需求:某资产近一个月的资产值 比如:今天是2018年2月28日,近一个月若是按照自然月来算,那么是2018年2月1日至2018年2月28日.最终需要的日期格式为:yyyyMMdd. 当日时间戳 uni ... 
- Python—数据类型之字典(Dict)
			其它数据类型转成字典 arr1 = ['jack', 'rose', 'marry'] arr2 = [68, 85, 66] dict1 = dict(zip(arr1, arr2)) print( ... 
- 第一篇【Zabbix服务端的完整布署】
			1.环境准备 服务器版本: [root@filestore-v2 ~]# cat /etc/redhat-release CentOS Linux release (Core) 内核版本: [root ... 
- 燕化迷你ACDP程序FEM / BDC
			带有BMW FEM / BDC模块的Mini ACDP可通过ICP或OBP模式支持FEM / BDC IMMO键编程.与传统的接线方式相比,它们有什么区别? 方法1:通过其他设备通过焊接进行FEM / ... 
- 4、路由事件 RoutedEvent
			路由事件的类型:具体参考https://www.cnblogs.com/jellochen/p/3475754.html Tunnel隧道方式:路由事件使用隧道策略,以便事件实例通过树向下路由(从根到 ... 
- luogu 1072 Hankson 的趣味题 唯一分解定理+线性筛
			貌似是比大多数题解优的 $O(n^2logn)$ ~ Code: #include <bits/stdc++.h> #define N 50004 #define setIO(s) fre ... 
- Inter IPP & Opencv + codeblocks 在centos 环境下的配置
			一.先安装codeblocks wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noar ... 
- oracle报错:The Network Adapter could not establish the connection的解决
			进入oracle安装目录\product\11.2.0\dbhome_1\NETWORK\ADMIN,修改listener.ora和tnsnames.ora,修改host 我的网络IP为192.168 ... 
