技术与热点应用 您所在的位置:电子展览网 > 行业资讯 > 技术与热点应用 > 手机设计与制造

android自定义控件:可旋转View:可作为ImageView、ImageButton




关键词:

  依然是Android用户体验问题,IPhone的多方向旋转支持要优于android,android的框架原本支持两个方向Portrait、 Landscape。

  要实现三种方向Portrait、Landscape、Landscape-reverse需要三种布局,但是三种布局用三套资源是很浪费的,尤其是图形化程序。

  为此自定义一个可指定三种方向控件,是很有必要的。

  自定义的View:

  view plaincopy to clipboardprint?

  1. /**

  2. *

  3.

  4. import android.content.Context;

  5. import android.graphics.Canvas;

  6. import android.graphics.drawable.Drawable;

  7. import android.util.AttributeSet;

  8. import android.util.Log;

  9. import android.view.View;

  10.

  11. /**

  12. * @author Bill

  13. * @rotateDegrees 仅支持 90.0 180.0 0.0(默认)

  14. * @background 图片资源文件

  15. */

  16. public class RotateableView extends View{

  17. /**

  18. * 命名区域

  19. */

  20. private final String namespace = "http://com.bill.cn";

  21. /**

  22. * 保存创建旋转角度

  23. */

  24. private float mRotateDegrees;

  25. /**

  26. * 保存创建背景图片的ID

  27. */

  28. private int mBackGroudDrawableId;

  29. /**

  30. * 利用图片ID加载图片

  31. */

  32. private Drawable mBackGroudDrawable;

  33. /**

  34. * 原始图片所需宽、高

  35. */

  36. private int mBackGroundWidth;

  37. private int mBackGroundHeight;

  38. public RotateableView(Context context, AttributeSet attrs) {

  39. super(context, attrs);

  40. // TODO Auto-generated constructor stub

  41. mBackGroudDrawableId=attrs.getAttributeResourceValue(namespace, "background", R.drawable.protractor_landscape_background);

  42. mBackGroudDrawable = context.getResources().getDrawable(

第1页 第2页 第3页 第4页 

  依然是android用户体验问题,IPhone的多方向旋转支持要优于android,android的框架原本支持两个方向Portrait、 Landscape。

  要实现三种方向Portrait、Landscape、Landscape-reverse需要三种布局,但是三种布局用三套资源是很浪费的,尤其是图形化程序。

  为此自定义一个可指定三种方向控件,是很有必要的。

  自定义的View:

  view plaincopy to clipboardprint?

  1. /**

  2. *

  3.

  4. import android.content.Context;

  5. import android.graphics.Canvas;

  6. import android.graphics.drawable.Drawable;

  7. import android.util.AttributeSet;

  8. import android.util.Log;

  9. import android.view.View;

  10.

  11. /**

  12. * @author Bill

  13. * @rotateDegrees 仅支持 90.0 180.0 0.0(默认)

  14. * @background 图片资源文件

  15. */

  16. public class RotateableView extends View{

  17. /**

  18. * 命名区域

  19. */

  20. private final String namespace = "http://com.bill.cn";

  21. /**

  22. * 保存创建旋转角度

  23. */

  24. private float mRotateDegrees;

  25. /**

  26. * 保存创建背景图片的ID

  27. */

  28. private int mBackGroudDrawableId;

  29. /**

  30. * 利用图片ID加载图片

  31. */

  32. private Drawable mBackGroudDrawable;

  33. /**

  34. * 原始图片所需宽、高

  35. */

  36. private int mBackGroundWidth;

  37. private int mBackGroundHeight;

  38. public RotateableView(Context context, AttributeSet attrs) {

  39. super(context, attrs);

  40. // TODO Auto-generated constructor stub

  41. mBackGroudDrawableId=attrs.getAttributeResourceValue(namespace, "background", R.drawable.protractor_landscape_background);

  42. mBackGroudDrawable = context.getResources().getDrawable(

第1页 第2页 第3页 第4页 

  接上页

  43. mBackGroudDrawableId);

  44. mRotateDegrees=attrs.getAttributeFloatValue(namespace, "rotateDegrees",0.0f);

  45. }

  46.

  47. @Override

  48. protected void onDraw(Canvas canvas) {

  49. // TODO Auto-generated method stub

  50. super.onDraw(canvas);

  51. /**

  52. * 旋转画布

  53. */

  54. if (mRotateDegrees==90.0f) {

  55. canvas.rotate(mRotateDegrees, 0, 0);

  56. canvas.translate(0, -mBackGroundHeight);

  57. } else {

  58. canvas.rotate(mRotateDegrees, mBackGroundWidth/2, mBackGroundHeight/2);

  59. }

  60. /**

  61. * 执行draw

  62. */

  63. mBackGroudDrawable.setBounds(0, 0, mBackGroundWidth, mBackGroundHeight);

  64. mBackGroudDrawable.draw(canvas);

  65. }

  66.

  67. @Override

  68. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

  69. // TODO Auto-generated method stub

  70. super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  71. /**

  72. * 设定View显示区域

  73. */

  74. mBackGroundHeight=mBackGroudDrawable.getMinimumHeight();

  75. mBackGroundWidth=mBackGroudDrawable.getMinimumWidth();

  76. if (mRotateDegrees==90.0f) {

  77. setMeasuredDimension(mBackGroundHeight, mBackGroundWidth);

  78. } else {

  79. setMeasuredDimension(mBackGroundWidth, mBackGroundHeight);

  80. }

  81. }

  82. }

  /** * import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.View; /** * @author Bill * @rotateDegrees 仅支持90.0 180.0 0.0(默认) * @background 图片资源文件 */ public class RotateableView extends View{ /** * 命名区域 */ private final String namespace =

第1页 第2页 第3页 第4页 

  接上页

"http://com.bill.cn"; /** * 保存创建旋转角度 */ private float mRotateDegrees; /** * 保存创建背景图片的ID */ private int mBackGroudDrawableId; /** * 利用图片ID加载图片 */ private Drawable mBackGroudDrawable; /** * 原始图片所需宽、高 */ private int mBackGroundWidth; private int mBackGroundHeight; public RotateableView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub mBackGroudDrawableId=attrs.getAttributeResourceValue(namespace, "background", R.drawable.protractor_landscape_background); mBackGroudDrawable = context.getResources().getDrawable( mBackGroudDrawableId); mRotateDegrees=attrs.getAttributeFloatValue(namespace, "rotateDegrees",0.0f); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); /** * 旋转画布 */ if (mRotateDegrees==90.0f) { canvas.rotate(mRotateDegrees, 0, 0); canvas.translate(0, -mBackGroundHeight); } else { canvas.rotate(mRotateDegrees, mBackGroundWidth/2, mBackGroundHeight/2); } /** * 执行draw */ mBackGroudDrawable.setBounds(0, 0, mBackGroundWidth, mBackGroundHeight); mBackGroudDrawable.draw(canvas); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); /** * 设定View显示区域 */ mBackGroundHeight=mBackGroudDrawable.getMinimumHeight(); mBackGroundWidth=mBackGroudDrawable.getMinimumWidth(); if (mRotateDegrees==90.0f) { setMeasuredDimension(mBackGroundHeight, mBackGroundWidth); } else { setMeasuredDimension(mBackGroundWidth, mBackGroundHeight); } } }

  XML使用控件:

  view plaincopy to clipboardprint?

  1. < ?xml version="1.0" encoding="utf-8"? >

  2. < RelativeLayout

  3. xmlns:android="http://schemas.android.com/apk/res/android"

  4. xmlns:bill="http://com.bill.cn"

  5. android:id="@+id/background"

  6. android:layout_width="wrap_content"

第1页 第2页 第3页 第4页 

  接上页

  7. android:layout_height="wrap_content" >

  8. < com.ihandysoft.carpenter.toolkit.widget.RotateableView

  9. android:layout_width="wrap_content"

  10. android:layout_height="wrap_content"

  11. ihandysoft:rotateDegrees="180.0"

  12. ihandysoft:background="@drawable/protractor_landscape_background"

  13. / >

  14.

  15. < /RelativeLayout >

第1页 第2页 第3页 第4页 

分享到:
收藏 打印
相关新闻
  • 没有相关信息!