您的位置:首页 > 编程语言

如何在代码中为组件设置dip,sp值

2013-10-10 12:56 281 查看
通常在android中textview一类的组件设定字体大小,,width,height都是在xml中设置,这个当然大家都是知道的,不过呢咱这里就当复习复习基础了

一.我们先看看要给一个Textview设置大小是16sp/dp/dip该如何做呢?

在android中为一个TextView组件设定字体大小是很容易的,android推荐使用sp作为文字显示的大小单位,因此为一个Textview设置字体大小有以下方式

1.android:textSize="16sp";或者android:textSize="@dimen/txt_size_16"(在values文件夹下中dimens.xml的定义<dimen name="txt_size_16">16sp</dimen>)

2.(假设已定义TextView实例tview)tview.setTextSize(16)或者tview.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

此处以TextView为例: 
创建一个TextView实例 
TextView tview=new TextView(this); 
Api中设置字体大小的方法 
tview.setTextSize(int unit, float size); 
tview.setTextSize(float size); 

注意:上述列子中TextView的文字最终显示的大小是相同的。tview的setTexView方法就是设置的scaled pixel大小的值,参见api描述: Set the default text size to the given value, interpreted as "scaled pixel" units. This size is adjusted based on the current density and user font size preference.

二.若是在代码中为组件dp/sp宽高尺寸呢?

在xml中指定组件的宽高很容易,可以使用px,dip(dp),sp等,android推荐使用dp/dip。由于android分辨率和显示屏物理尺寸的差异。我们知道很多时候我们可能需要动态添加一些组件,并为这些组件指定大小,这个大小又还必须在不同分辨率不同尺寸的设备下显示较好的几乎一致的效果,我们该怎么办呢?我想肯定会想着去设置dp/dip/sp值,那么到底如何去设置呢?

我自己有以下方法:

方法:通过查api,我们知道在android内部会使用TypedValue.applyDimension函数将所有单位(sp/dp/dip等)换算成px,所以我们的方法与此有关,首先看看这个转换的方法

 

public static float applyDimension(int unit, float value, 
                                   DisplayMetrics metrics) 

    switch (unit) { 
    case COMPLEX_UNIT_PX: 
        return value; 
    case COMPLEX_UNIT_DIP: 
        return value * metrics.density; 
    case COMPLEX_UNIT_SP: 
        return value * metrics.scaledDensity; 
    case COMPLEX_UNIT_PT: 
        return value * metrics.xdpi * (1.0f/72); 
    case COMPLEX_UNIT_IN: 
        return value * metrics.xdpi; 
    case COMPLEX_UNIT_MM: 
        return value * metrics.xdpi * (1.0f/25.4f); 
    } 
    return 0; 


所以我们的实现方法当然与此有关了,下面是代码部分:

home.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
 
    <TextView 
        android:id="@+id/textView1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="xml中以dp为单位显示" /> 
 
    <ImageView 
        android:id="@+id/imageView1" 
        android:layout_width="100dip" 
        android:layout_height="100dip" 
        android:layout_marginTop="10dp" 
        android:src="@drawable/a11" /> 
 
    <TextView 
        android:id="@+id/textView2" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="14dp" 
        android:text="代码动态添加值" /> 
 
    <ImageView 
        android:id="@+id/imageView2" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:src="@drawable/a11" /> 
 
</LinearLayout> 

 

HomeActivity.java

 

package com.example.aboutexpand; 
 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.util.TypedValue; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
 
public class HomeActivity extends Activity { 
    private ImageView imgView1 = null;// xml布局中定义大小宽高为100dip 
    private ImageView imgView2 = null;// 需要动态设置大小,也要为100dip 
    ImageButton imgBtn = null; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.home); 
        imgView1 = (ImageView) findViewById(R.id.imageView1); 
        int img1H = imgView1.getDrawable().getIntrinsicHeight(); 
        int img1W = imgView1.getDrawable().getIntrinsicWidth(); 
 
        imgView2 = (ImageView) findViewById(R.id.imageView2); 
        // 方法一 
        // imgView2.setLayoutParams(new LinearLayout.LayoutParams( 
        // (int) getRawSize(TypedValue.COMPLEX_UNIT_DIP, 100), 
        // (int) getRawSize(TypedValue.COMPLEX_UNIT_DIP, 100))); 
        // 方法二 
        imgView2.setLayoutParams(new LinearLayout.LayoutParams( 
                getIntFromDimens(R.dimen.img_height), 
                getIntFromDimens(R.dimen.img_widthe))); 
 
        int img2H = imgView2.getDrawable().getIntrinsicHeight(); 
        int img2W = imgView2.getDrawable().getIntrinsicWidth(); 
        TextView tview1 = (TextView) findViewById(R.id.textView1); 
        tview1.getText(); 
        tview1.setText(tview1.getText() + "图片h" + img1H + "w" + img1W); 
        TextView tview2 = (TextView) findViewById(R.id.textView2); 
        tview2.setText(tview2.getText() + "图片h" + img2H + "w" + img2W); 
    } 
 
    // 方法一 
    public float getRawSize(int unit, float value) { 
        Resources res = this.getResources(); 
        return TypedValue.applyDimension(unit, value, res.getDisplayMetrics()); 
    } 
 
    // 方法2,需先在values中dimens的进行设置 
    public int getIntFromDimens(int index) { 
        int result = this.getResources().getDimensionPixelSize(index); 
        return result; 
    } 
 


运行截图:

 





 
本文出自 “壮志凌云” 博客,请务必保留此出处http://sunjilife.blog.51cto.com/3430901/1159091
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: