具体要看你想做什么 最简单的方法是将物体封装成个实体 然后赋予坐标属性 用线程类去控制坐标属行的变化 至于屏幕三分之一出 你可以通过系统封装好的display()函数(好像是这个)来获取屏幕的宽度和高度 然后对宽高进行的三分之一分别赋值给实体的坐标即可
方法一:隐藏
Android中布局内容被底部系统导航栏遮挡
方法二:内容上移
Android手机底部NavigationBar挡住界面的解决方法
在 Manifestxml 文件中设置 Activity 的属性
Android布局界面隐藏顶部导航栏
Android隐藏和显示虚拟导航栏
Android 获取手机存储总大小,系统占用空间
Android 获取屏幕宽度和高度的几种方法
Android 获取电池相关信息
Android电量计重要的类及函数介绍
安卓50后获取所有运行的进程信息
Android获取内存(RAM)大小信息
android 几种杀进程的方式
Android开发中 获取App缓存大小以及清除缓存
LoopergetMainLooper()使用误区
Android中通过资源文件获取drawable的几种方法
Fragment向Activity传递值
注意:
AlertDialog dialog = buildercreate();
dialogsetView(view);
dialogshow();
WindowManager m = getWindowManager();
Display d = mgetDefaultDisplay(); //为获取屏幕宽、高
androidviewWindowManagerLayoutParams p = dialoggetWindow()getAttributes(); //获取对话框当前的参数值
pheight = (int) (dgetHeight() 03); //高度设置为屏幕的03
pwidth = (int) (dgetWidth() 05); //宽度设置为屏幕的05
dialoggetWindow()setAttributes(p); //设置生效
这个可以给你参考一下,你应该是自定义样式的dialog 你只需要在dialogsetView(view);之前把你的布局加载进去就可以了。
iGoOneo3最小宽度dp指的是iGoOneo3手机屏幕最小宽度的尺寸单位,通常用于适配不同屏幕尺寸的移动端设备。最小宽度dp是指在屏幕方向为竖屏时,屏幕宽度的最小值,以dp为单位。iGoOneo3最小宽度dp的数值可以通过查询设备规格或使用代码获取。具体来说,iGoOneo3最小宽度dp的值是360dp,这意味着该设备的屏幕宽度最小值为360dp,可以通过此数值来进行移动端适配。在开发过程中,需要根据不同设备的最小宽度dp来进行不同的UI布局和适配处理,以确保应用程序在不同设备上的显示效果和用户体验。
Android80 以后凹口屏得到迅速发展,目前已有了挖孔屏/水滴屏/刘海屏等各式各样的屏幕,究其根本依旧是凹口屏,单华为一个品牌就涵盖了基本所有类型,而对于屏幕适配也是不可逃避的问题。小菜单独对华为各型号屏幕进行适配尝试,部分方法可通用到其他品牌设备,为 Android 标准 SDK 方法。
其实凹口屏已经出现很久了,对于获取凹口宽高的方式也有很多种,但是以前主流的凹口屏中凹口位置一般是位于屏幕正上方,但随着发展,也出现了在左上角的挖孔屏样式。相应的, Android 90 即 SDK28 也发布了获取凹口屏的方法。
对华为设备凹口屏适配情况来说,若仅需获取凹口位置的宽高,如下方法即可,在 Android 各版本中均可( Android 90 及以上亦可)。此时获取屏幕水平方向安全位置时,可根据屏幕宽度-凹口宽度再左右均分即可。
对于华为新出的挖孔屏设备基本均为 Android 90 及以上, Android 90 提供了对凹口屏相关的 SDK ,谷歌认为凹口位置可以不固定位置也不固定个数,但是对于设备一条边只能有一个;如下方法对于 Android 90 及以上设备判断均可。 SDK 不仅可以判断是否为凹口屏,同时可以获取各个凹口大小及所在位置。
对于凹口屏适配还有很多机型要单独处理,以上仅对华为设备进行参考;如果有不对的地方还希望多多指出。
网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用 屏幕分辨率限定符 进行适配,即每种屏幕分辨率的设备需要定义一套 dimensxml 文件。由于不同分辨率的设备太多了,而且有些设备还有虚拟按键(例如华为手机),这样就还需要每个有虚拟按键的设备加多一套 dimensxml 文件,再加上平板那些你会发现 dimensxml 文件所占的体积已经超过 2M 了!这绝对不是我们想要的。
我这里要讲的是使用 sw<N>dp 限定符,即 smallestWidth(最小宽度) 限定符 来进行适配,使用这种方式只需要少量 dimensxml 文件即可达到适配,而且根本不用考虑虚拟按键的问题。如果只适配手机,dimensxml 文件所占的体积只有 100 多 KB,即使加上平板和 TV,也就 500 多 KB,完全可以接收。这种方案已经在自己多个项目中应用过了,经过几十台手机测试过,基本不会出现适配有问题的情况。制作生成对应 dimensxml 文件插件(后面会讲)的作者也说过他在待过的两家大公司实践过,所以请放心使用。
关于为什么要进行屏幕适配,什么是 dp、dpi 这些概念我就不去一一讲解了,网上很多文章。这里我推荐几篇讲的比较好的:
屏幕分辨率限定符适配需要在 res 文件夹下创建各种屏幕分辨率对应的 values-xxx 文件夹,如下图:
然后根据一个基准分辨率,例如基准分辨率为 1280x720,将宽度分成 720 份,取值为 1px~720px,将高度分成 1280 份,取值为 1px~1280px,生成各种分辨率对应的 dimensxml 文件。如下分别为分辨率 1280x720 与 1920x1080 所对应的横向 dimensxml 文件:
假设设计图上的一个控件的宽度为 720px,那么布局中就写 android:layout_width="@dimen/x720" ,当运行程序的时候,系统会根据设备的分辨率去寻找对应的 dimensxml 文件。例如运行在分辨率为 1280x720 的设备上,系统会自动找到对应的 values-1280x720 文件夹下的 lay_xxml 文件,由上图可知 x720 对应的值为
720px,可铺满该屏幕宽度。运行在分辨率为 1920x1080 的设备上,系统会自动找到对应的 values-1920x1080 文件夹下的 lay_xxml 文件,由上图可知 x720 对应的值为 10800px,可铺满该屏幕宽度。这样就达到了屏幕适配的要求!
smallestWidth 限定符适配原理与屏幕分辨率限定符适配原理一样,系统都是根据限定符去寻找对应的 dimensxml 文件。例如程序运行在最小宽度为 360dp 的设备上,系统会自动找到对应的 values-sw360dp 文件夹下的 dimensxml 文件。区别就在于屏幕分辨率限定符适配是拿 px 值等比例缩放,而 smallestWidth 限定符适配是拿 dp 值来等比缩放而已。需要注意的是“最小宽度”是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是“最小宽度”。如下分别为最小宽度为 360dp 与最小宽度为 640dp 所对应的 dimensxml 文件:
ScreenUtils——> ScreenUtils
既然原理都一样,都需要多套 dimensxml 文件,那为什么要选择 smallestWidth 限定符适配呢?
大多数 UI 设计师提供的设计图无非就几种,它们对应的获取方式如下:
这些文件当然不会手动去写,网上已经有大神提供了自动生成这些文件的插件 ScreenMatch 。但是这个插件还是有点问题的:
基于以上问题,我在该插件的源码上优化生成了新的插件 ScreenMatch ,由于插件库已经有原作者的插件了,所以我就不重复造轮子上传到插件库了,你直接用本地安装的方式安装即可。
工具使用步骤:
然后选择在哪个 module 下执行适配。即基于哪个 module 下的 res/values/dimensxml 文件作为基准 dimensxml 文件,生成的其他尺寸 dimensxml 文件放在哪个 module 下。例如选择 app,然后点击 OK ,出现如下界面表示生成文件成功。如下图:
然后再看看 res 目录下会自动生成一堆 dimensxml 文件,如下图:
通过上面的步骤就已经生成了所有设备对应的 dimensxml 文件。
步骤 3 是以插件默认的最小宽度基准值为 360dp,适配的设备最小宽度为
320,360,384,3927272,400,410,4114285,432,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365(包含了平板和 TV )生成的文件,但实际情况要根据设计图和需求设置。
例如设计图的最小宽度为 375dp,则需要更改最小宽度基准值为 375dp。如果项目只需要适配手机的话,适配的设备最小宽度保留 320,360,384,3927272,400,410,4114285,432,480 即可,若发现手机还有其他最小宽度自行加上即可,也麻烦把该最小宽度提供给我,我们一起来完善该份适配。
以上修改需要在配置文件里修改,即 screenMatchproperties 文件,该配置文件是执行完上面第 3 步后自动生成在项目的跟目录下的。如下图:
打开配置文件,修改下图中 1、3、4 的值即可。(图中单位均为 dp)
1:最小宽度基准值,填写设计图的最小宽度值即可。
2:插件默认适配的最小宽度值,即默认情况下会生成如下值的 dimensxml 文件。
3:需要适配的最小宽度值(如果是小数,则保留 4 位小数。例如 392727272,则取 3927272),即你想生成哪些 dimensxml 文件。
4:忽略不需要适配的最小宽度值,即忽略掉插件默认生成的 dimensxml 文件。
配置文件修改完成后,重新执行第 3 步,生成新的 dimensxml 文件。
当然!如果你的设计图也是标准的 360dp,那么上面的步骤你可以忽略。直接复制我 github 上你需要的 dimensxml 文件到你的项目即可, 默认的 values 文件夹下也需要一份 。
设计图标注多少 dp,布局中就写多少 dp ,非常方便!
大多数 UI 设计师提供的设计图无非就几种,它们对应的使用方式如下:
说了这么多,其实只需要简单的 2 步:
很多人肯定会有疑问,难道我用了这套适配方案就可以全部直接写死宽高了?那肯定不是的,如果一些好用的适配技巧能实现的,那就不要用直接写死宽高的方式。这套适配方案搭配下面这些适配技巧可以让你的屏幕适配更完美。
绝对布局(AbsoluteLayout)直接使用 X、Y 坐标来控制控件的位置,对于屏幕碎片化这么严重的今天,使用绝对布局对于屏幕适配来说就是灾难性的,所以 Google 已经废弃了该控件。
相对布局(RelativeLayout)或者约束布局(ConstraintLayout)就不一样了,相对布局的子控件之间使用 相对位置 的方式排列,即使屏幕的大小改变,控件的相对位置也不会变化,与屏幕大小无关,灵活性很强。约束布局也是类似的,通过对某些控件进行约束来确定它们之间的位置。
Nine-Patch 是一种被特殊处理过的 PNG ,你可以指定哪些区域可以拉伸而哪些区域不可以。例如聊天界面中的聊天气泡背景图就需要做成 Nine-Patch ,因为每条消息的字数不是固定的,如果背景不能随着字数的长短进行缩放,那么就会导致背景变形。
因为各种屏幕高宽比并不是固定的,有 16:9、4:3,还有全面屏的 195:9 等等,如果强行将宽高都适配那只会导致布局变形。
例如一个控件的宽高为 360dp 和 640dp,如果将它显示在宽高为 360dp 和 640dp 的设备上是正常铺满整个屏幕的,但是显示在宽高为 360dp 和 780dp 的设备上高度则不能铺满,如果你让高度铺满,而宽度又保持不变,那就会出现变形的情况。所以这也就是为什么目前市面上的屏幕适配方案只能以宽或高一个维度去适配,另一个方向用滑动或权重的方式去适配的原因。
那你为什么说高度也能适配呢?
这里说的高度也能适配指的是在不同分辨率和密度的手机上能达到等比缩放的适配,其他屏幕适配方案也是一样的。
注意:smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。
同横屏道理一样,平板、TV 与手机的宽高差距太大,想要平板、TV 也能完全适配,那就只能让设计师出一套平板、TV 的设计图,然后单独写一套平板、TV 的布局文件。
注意:再说一遍,smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。
github 地址: ScreenAdaptation
参考资料:
在实际工作中,我们经常需要在程序里面用代码来控制一些组件的宽度和高度,以适应不同分辨率的屏幕。尽管有不同的Layout供我们使用,但很多时候需要通过用代码设定组件的大小,以达到良好的界面视觉效果。
注意:组件和控件是有区别的。组件对应的英文是component,控件对应的英文是control;控件是带有界面的,组件则未必有界面;控件属于组件,可以说它是带有界面的组件。比如Button有界面,因此可以说它是控件,也可以说它是组件。LinearLayout没有界面,因此它不能算是控件,但它却是组件。本文中由于涉及了带有和不带有界面的组件,因此,用组件泛指这两者。
有些组件,比如Button,可以在程序中用setWidth和setHeight来设定其大小,这是非常方便的。但有些组件却没有这两个设定大小的方法,比如ImageButton、Spinner以及LinearLayout等等,那么如何在程序中根据需要,动态地设定他们的大小呢?下面就用实际的例子来说明这个问题。
1 首先创建一个Android项目:
2 将文件magnifierpng拖入到项目的res/drawable-mdpi文件夹下。mangifierpng的内容如下:
3 在stringsxml中,增加如下粗体字代码。这些代码,将会被Spinner使用:
<string name="spin_prompt">请选择城市 </string>
<string-array name="cities">
<item>北京 </item >
<item>上海 </item >
<item>南京 </item >
<item>乌鲁木齐 </item>
<item>哈尔滨 </item>
<item>符拉迪沃斯托克 </item>
</string-array>
4 修改mainxml,使之如下:
<xml version="10"encoding="utf-8">
<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Buttonandroid:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<ImageButtonandroid:id="@+id/image_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/magnifier"
/>
<Spinnerandroid:id="@+id/sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/cities"
android:prompt="@string/spin_prompt"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayoutandroid:id="@+id/ll_left"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
/>
</LinearLayout>
<LinearLayoutandroid:id="@+id/ll_right"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
不难看出,mainxml有一个Button,一个ImageButton,一个Spinner和两个EditText。
5 运行本项目,得到的结果如下:
现在假定,我们要:
a) 增加Button的高度
b) 增加ImageButton的宽度和高度
c) 增加Spinner的宽度
d) 将包含Hello的EditText靠左,包含Android的EditText靠右
6 修改AdjustControlSizejava的代码,使之如下:
public class AdjustControlSize extends Activity
{
private Button btn;
private ImageButton imagebtn;
private Spinner sp;
private LinearLayout ll_left;
private LinearLayout ll_right;
private DisplayMetrics dm;
@Override
public void onCreate(Bundle savedInstanceState)
{
superonCreate(savedInstanceState);
setContentView(Rlayoutmain);
// 获取屏幕尺寸
dm = new DisplayMetrics();
getWindowManager()getDefaultDisplay()getMetrics(dm);
btn = (Button)findViewById(Ridbtn);
imagebtn = (ImageButton)findViewById(Ridimage_btn);
sp =(Spinner)findViewById(Ridsp);
ll_left = (LinearLayout)findViewById(Ridll_left);
ll_right = (LinearLayout)findViewById(Ridll_right);
// 增加Button的高度,可以很方面地通过setHeight方法来实现。
btnsetHeight(80);
// 但如果要想在代码中改变某些组件,比如ImageButton、Spinner以及LinearLayout,
// 用setHeight或者setWidth的方式就不行了,因为这些组件中,没有提供这两个方法。
// 为此,可以通过LayoutParams这个类(这里我们用LinearLayoutLayoutParams)来实现这一点。
// 改变imagebtn的宽度和高度均为屏幕宽度的1/4
LinearLayoutLayoutParams imagebtn_params = newLinearLayoutLayoutParams(
LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);
imagebtn_paramsheight = dmwidthPixels / 4;
imagebtn_paramswidth = dmwidthPixels / 4;
imagebtnsetLayoutParams(imagebtn_params);
// 设定sp的宽度为屏幕宽度的2/3
LinearLayoutLayoutParams sp_params = new LinearLayoutLayoutParams(
LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);
sp_paramswidth = dmwidthPixels 2 / 3;
spsetLayoutParams(sp_params);
// 让两个EditText分别处于屏幕的左右两端。
// 在mainxml中,两个EditText分别处于ll_left和ll_right这两个LinearLayout中,且
// 处于ll_left的gravity属性为left,即置于其中的组件靠左;处于ll_right的gravity
// 属性为right,即置于其中的组件靠右。但是由于这两个LinearLayout的宽度属性均为
// wrap_content,所以它们靠在一起了,由此导致了两个EditText也靠在一起。
// 如果,我们把ll_left和ll_right的宽度能够设定为屏幕宽度的一半,那么两个EditText就
// 会分别处于屏幕的两端。
LinearLayoutLayoutParams ll_params = new LinearLayoutLayoutParams(
LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);
ll_paramswidth = dmwidthPixels / 2;
ll_leftsetLayoutParams(ll_params);
ll_rightsetLayoutParams(ll_params);
}
}
以上就是关于安卓游戏开发中,让一个物体在屏幕三分之一处移动,该怎么实现全部的内容,包括:安卓游戏开发中,让一个物体在屏幕三分之一处移动,该怎么实现、Android知识串讲(1) 底部导航栏遮挡|转屏锁定|ActionBar隐藏、android 如何让自定义dialog的宽度充满整个屏幕等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)