Android : 把一个layout转化成一个Drawable的实例

最近有个需求需要把menu的icon和title同时显示出来(显示在一行上),但是在资源文件中定义menu 时使用android:showAsAction="ifRoom|withText" ,没有效果,于是就有了以下的解决方案。

实现思路:Layout -> View -> Bitmap -> Drawable

下面的实现是,把含有一张图片(ImageView)和一个字符串(TextView)的layout转化成一个Drawable资源,其他menu可以调用setIcon(Drawable)来使用这个合成的Drawable:

Layout file: test.xml  


    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >    

            android:id="@+id/display"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:src="@android:drawable/ic_menu_help" />

            android:id="@+id/textTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dip"
        android:layout_marginTop="20dip"
        android:textSize="25dip"
        android:text="@string/default_title"   
        android:textColor="@color/white" />   

[Code]

    public Drawable LayoutToDrawable( int  layout_id ){         

        LayoutInflater inflator = getLayoutInflater();
        View viewHelp = inflator.inflate(/*R.layout.test */ layout_id, null);

        TextView textView = (TextView)findViewById(R.id.textTitle);
        int size = (int)textView.getText().length();
        Bitmap snapshot = convertViewToBitmap(viewHelp, size);
        Drawable drawable = (Drawable)new BitmapDrawable(snapshot);

        return drawable;

     }

public static Bitmap convertViewToBitmap(View view, int size) {
      view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
      MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
      int width = size*40;
      view.layout(0, 0, width, view.getMeasuredHeight());  //根据字符串的长度显示view的宽度
      view.buildDrawingCache();
      Bitmap bitmap = view.getDrawingCache();
      return bitmap;
}

如何使用

  Drawable mDrawable = LayoutToDrawable(R.layout.test);

  MenuItem testItem = menu.findItem(R.id.testItem);;  //这个放在main.xml里面,自己测试一下

  testItem.setIcon(mDrawable);  

[End]


[效果截图]


这是其中的一种解决方案,如何你有更好的解决方案,希望能和大家分享一下。

-Hope can help you-



你可能感兴趣的:(Android)