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的转 ...
随机推荐
- Tomcat启动中文乱码,淇℃伅等
打开Tomcat根目录下的conf文件夹,打开logging.properties. 把 java.util.logging.ConsoleHandler.encoding = UTF-8 换成 ja ...
- js创建对象的几种方式(工厂模式、构造函数模式、原型模式)
普通方法创建对象 var obj = { name:"猪八戒", sayname:function () { alert(this.name); } } var obj1 = { ...
- 【线段树哈希】「Balkan OI 2016」Haker
1A海星 题目大意 给你一个长度为 $n$ ,由小写字母构成的字符串 $S$ 和 $Q$ 个操作,每个操作是以下 3 种之一: 1 x y k :询问当前字符串从位置 $x$ 到 $y$ 的子串与从位 ...
- jquery实现静态页面include
最近在写一套前端页面,发现每个页面都复制一遍公共头.尾,十分不方便.于是就想能否也像PHP模板引擎一样,使用include引入公共文件,这便是接下来这段代码的意义.我们先来总结一下需求: 1.可以像使 ...
- Codeforces 852F String Compression
题目 OvO http://codeforces.com/contest/825/problem/F 题解 KMP+DP 十分优雅地利用了KMP的fail数组 fail[k]表示第k个后缀的的fail ...
- 二叉树的序遍历x(内含结构体与非结构体版x)
3143 codevs 二叉树的序遍历 题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个 ...
- 家庭问题x
[问题描述] 有n个人,编号为1,2,……n,另外还知道存在K个关系.一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员. 当n,k和k个关系给出之后,求出其中共有多少个家庭.最大的家庭 ...
- 【CUDA 基础】3.5 展开循环
title: [CUDA 基础]3.5 展开循环 categories: - CUDA - Freshman tags: - 展开归约 - 归约 - 模板函数 toc: true date: 2018 ...
- 关于int main(int argc,char* argv[])详解
平时在VS的环境下,主函数总会看到这两个参数,今天突然很想知道这两个参数的原理以及作用,因此查了下资料.真心受教了. 下面的博文是在百度空间看一位大神的,原文链接:http://hi.baidu.co ...
- js输入密文弹出数字键盘
我们经常被产品要求,在移动端的web页面上的输入框输入密码时要弹出数字键盘,而不是全键盘,这个该怎么实现呢? 1.首先要弹出数字键盘,我们只能把input框的type从password改为tel 2. ...