android-R.fraction

来源:互联网 发布:js new string 编辑:程序博客网 时间:2024/05/18 20:11

R.fraction

public static final class R.fraction 
extends Object 

java.lang.Object   ↳android.R.fraction

Summary


Public constructors

R.fraction()

Inherited methods

From class java.lang.Object

Public constructors


R.fraction

Added in API level 11

R.fraction ()

在这个类里面有一个方法,找了好久才找到具体是什么意思。

context.getResources().getFraction(int id, int base, int pbase)

id参数我们传入了一个fraction的资源,后两个参数按官方文档的意思可以动态改变分子和分母的值,也就是分子*base,分母*pbase,在这里我们保持分数不变,所以两个都传入1。

我做了一个测试:
在dimens.xml文件中定义
<resources>    <item name="screen_offset_percentage" type="dimen">80%</item></resources>

代码测试:

                Log.i("TAG", "fraction1--1:" + res.getFraction(R.dimen.screen_offset_percentage, 1, 1));// 64.00003float screenOffset = (getScreenWidth() * res.getFraction(R.dimen.screen_offset_percentage, 1, 1));Log.i("TAG", "screenOffset1--1:" + screenOffset);int screenOffset2 = (int) (getScreenWidth() * res.getFraction(R.dimen.screen_offset_percentage, 1, 1));Log.i("TAG", "screenOffset21--1:" + screenOffset2);Log.i("TAG", "fraction2--1:" + res.getFraction(R.dimen.screen_offset_percentage, 2, 1));// 64.00003float screenOffset3 = (getScreenWidth() * res.getFraction(R.dimen.screen_offset_percentage, 2, 1));Log.i("TAG", "screenOffset2--1:" + screenOffset3);int screenOffset33 = (int) (getScreenWidth() * res.getFraction(R.dimen.screen_offset_percentage, 2, 1));Log.i("TAG", "screenOffset22--1:" + screenOffset33);运行结果:
06-21 10:45:24.455: I/TAG(6832): fraction1--1:0.7999999506-21 10:45:24.455: I/TAG(6832): screenOffset1--1:639.9999406-21 10:45:24.455: I/TAG(6832): screenOffset21--1:63906-21 10:45:24.455: I/TAG(6832): fraction2--1:1.599999906-21 10:45:24.460: I/TAG(6832): screenOffset2--1:1279.999906-21 10:45:24.460: I/TAG(6832): screenOffset22--1:1279

下面引进一下别人的文章。这个属性对于屏幕自适应很有用,特别是弹窗

因为安卓的分辨率和尺寸繁多,所以我们在开发时需考虑控件的自适应,这不,在自定义对话框的时候是不是有这样的苦恼:对话框的宽度无法和系统的对话框宽度一样。这里就送大家一个可以自适应的对话框:

import android.app.DialogFragment;import android.view.WindowManager;/** * Created by solo on 15/1/19. */public class MinimumDialogFragment extends DialogFragment {  @Override  public void onStart() {    super.onStart();    WindowManager.LayoutParams lp = DialogUtils.createLayoutParams(getDialog());    getDialog().getWindow().setAttributes(lp);  }  public static WindowManager.LayoutParams createLayoutParams(Dialog dialog) {    Activity context = dialog.getOwnerActivity();    final DisplayMetrics metrics = context.getResources().getDisplayMetrics();    final boolean isPortrait = metrics.widthPixels < metrics.heightPixels;    float percent;    if (isPortrait) {      percent = context.getResources().getFraction(R.fraction.dialog_min_width_minor, 1, 1);    } else {      percent = context.getResources().getFraction(R.fraction.dialog_min_width_major, 1, 1);    }    int width = (int) (context.getResources().getDisplayMetrics().widthPixels * percent);    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();    lp.copyFrom(dialog.getWindow().getAttributes());    lp.width = width;    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;    return lp;  }}

上面的代码中,有个需要注意的方法:

context.getResources().getFraction(int id, int base, int pbase)

id参数我们传入了一个fraction的资源,后两个参数按官方文档的意思可以动态改变分子和分母的值,也就是分子*base,分母*pbase,在这里我们保持分数不变,所以两个都传入1。

最后根据屏幕宽度算出对话框占用的百分比:

int width = (int) (context.getResources().getDisplayMetrics().widthPixels * percent);

在这里我们还没有做完,因为平板上的对话框并不像手机一样那么窄,而且还有横竖屏之分,所以当横屏的时候,我们需要给予对话框不同的百分比宽度。分别添加以下xml文件(文件由官方源码提供):

.../values/dimens.xml

<item type="fraction" name="dialog_min_width_major">65%</item><item type="fraction" name="dialog_min_width_minor">95%</item>

.../values-large/dimens.xml

<item type="fraction" name="dialog_min_width_major">55%</item><item type="fraction" name="dialog_min_width_minor">80%</item>

.../values-xlarge/dimens.xml

<item type="fraction" name="dialog_min_width_major">45%</item><item type="fraction" name="dialog_min_width_minor">72%</item>


0 0
原创粉丝点击