首页 > 其他分享 >Android软件开发之盘点自定义View界面大合集

Android软件开发之盘点自定义View界面大合集

时间:2022-10-06 12:09:34浏览次数:48  
标签:canvas 自定义 Button mPaint import Android View public android


今天我用自己写的一个Demo 和大家详细介绍一个Android中自定义View中的使用与绘制技巧。







1.自定义view绘制字符串      

       相信在实际开发过程中必然很多地方都须要用到系统字 为什么会用到系统字? 方便 省内存 我相信做过J2ME游戏开发的朋友应该深知内存有多么多么重要  而且使用它还可以带来一个更重要的好处就是很方便的可以实现多国语言的切换 笔者现在在正在做的一个产品就是可以多语言切换的软件  有英语 繁体中文 等等 设想如果使用图片字的话那每个语言都须要出一套图,我用一个例子简单介绍一下绘制字符串。







​view plain​​​ ​​copy to clipboard​​​ ​​print​​​ ​​?​


  1. package

  2. import
  3. import
  4. import
  5. import
  6. import
  7. import
  8. import
  9. import
  10. import

  11. public class Font extends
  12. public int mScreenWidth = 0;
  13. public int mScreenHeight = 0;
  14. @Override
  15. protected void
  16. new FontView(this));
  17. // 获取屏幕宽高
  18. Display display = getWindowManager().getDefaultDisplay();
  19. mScreenWidth  = display.getWidth();
  20. mScreenHeight = display.getHeight();
  21. super.onCreate(savedInstanceState);

  22. }

  23. class FontView extends
  24. public final static String STR_WIDTH = "获取字符串宽为:";
  25. public final static String STR_HEIGHT = "获取字体高度为:";
  26. null;

  27. public
  28. super(context);
  29. new
  30. }

  31. @Override
  32. protected void
  33. //设置字符串颜色
  34. mPaint.setColor(Color.WHITE);
  35. "当前屏幕宽" + mScreenWidth, 0, 30, mPaint);
  36. "当前屏幕高"+ mScreenHeight, 0, 60, mPaint);
  37. //设置字体大小
  38. mPaint.setColor(Color.RED);
  39. 18);
  40. "字体大小为18", 0, 90, mPaint);
  41. //消除字体锯齿
  42. mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  43. "消除字体锯齿后", 0, 120, mPaint);
  44. //获取字符串宽度
  45. 0, 150, mPaint);
  46. //获取字体高度
  47. 0, 180, mPaint);
  48. //从string.xml读取字符串绘制
  49. mPaint.setColor(Color.YELLOW);
  50. 0, 210, mPaint);
  51. super.onDraw(canvas);
  52. }

  53. /**
  54. * 获取字符串宽
  55. * @param str
  56. * @return
  57. */
  58. private int
  59. return (int) mPaint.measureText(STR_WIDTH);
  60. }
  61. /*
  62. * 获取字体高度
  63. */
  64. private int
  65. FontMetrics fm = mPaint.getFontMetrics();
  66. return (int)Math.ceil(fm.descent - fm.top) + 2;
  67. }
  68. }
  69. }

package cn.m15.xys;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;import android.os.Bundle;import android.view.Display;import android.view.View;public class Font extends Activity { public int mScreenWidth = 0; public int mScreenHeight = 0; @Override protected void onCreate(Bundle savedInstanceState) {setContentView(new FontView(this));// 获取屏幕宽高Display display = getWindowManager().getDefaultDisplay();mScreenWidth = display.getWidth();mScreenHeight = display.getHeight();super.onCreate(savedInstanceState); } class FontView extends View { public final static String STR_WIDTH = "获取字符串宽为:"; public final static String STR_HEIGHT = "获取字体高度为:"; Paint mPaint = null; public FontView(Context context) { super(context); mPaint = new Paint();}@Overrideprotected void onDraw(Canvas canvas) { //设置字符串颜色 mPaint.setColor(Color.WHITE); canvas.drawText("当前屏幕宽" + mScreenWidth, 0, 30, mPaint); canvas.drawText("当前屏幕高"+ mScreenHeight, 0, 60, mPaint); //设置字体大小 mPaint.setColor(Color.RED); mPaint.setTextSize(18); canvas.drawText("字体大小为18", 0, 90, mPaint); //消除字体锯齿 mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); canvas.drawText("消除字体锯齿后", 0, 120, mPaint); //获取字符串宽度 canvas.drawText(STR_WIDTH + getStringWidth(STR_WIDTH), 0, 150, mPaint); //获取字体高度 canvas.drawText(STR_HEIGHT + getFontHeight(), 0, 180, mPaint); //从string.xml读取字符串绘制 mPaint.setColor(Color.YELLOW); canvas.drawText(getResources().getString(R.string.string_font), 0, 210, mPaint); super.onDraw(canvas);}/** * 获取字符串宽 * @param str * @return */private int getStringWidth(String str) { return (int) mPaint.measureText(STR_WIDTH); }/* * 获取字体高度 */private int getFontHeight() { FontMetrics fm = mPaint.getFontMetrics(); return (int)Math.ceil(fm.descent - fm.top) + 2;} }}

 

2.绘制无规则几何图形

        绘制无规则几何图形似乎在实际工作中很少可以用到 原因是用程序去绘制图形即使在精准再好看也不会有美术出的图片好看 但是使用程序绘制图形作为学习来说却是基础中的基础,所以建议大家都看一看。





​view plain​​​ ​​copy to clipboard​​​ ​​print​​​ ​​?​


  1. package

  2. import
  3. import
  4. import
  5. import
  6. import
  7. import
  8. import
  9. import
  10. import

  11. public class Geometry extends
  12. public int mScreenWidth = 0;
  13. public int mScreenHeight = 0;

  14. @Override
  15. protected void
  16. new GeometryView(this));
  17. super.onCreate(savedInstanceState);

  18. }

  19. class GeometryView extends
  20. null;

  21. public
  22. super(context);
  23. new
  24. mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  25. }

  26. @Override
  27. protected void
  28. super.onDraw(canvas);

  29. //设置画布颜色 也就是背景颜色
  30. canvas.drawColor(Color.WHITE);

  31. mPaint.setColor(Color.BLACK);
  32. "绘制无规则几何图形喔!!!", 150, 30, mPaint);

  33. //绘制一条线
  34. mPaint.setColor(Color.BLACK);
  35. 4);
  36. 0, 0, 100, 100, mPaint);

  37. //绘制一个矩形
  38. mPaint.setColor(Color.YELLOW);
  39. 0, 120, 100, 200, mPaint);

  40. //绘制一个圆形
  41. mPaint.setColor(Color.BLUE);
  42. 80, 300, 50, mPaint);

  43. //绘制一个椭圆
  44. mPaint.setColor(Color.CYAN);
  45. new RectF(300,370,120,100), mPaint);

  46. //绘制多边形
  47. mPaint.setColor(Color.BLACK);
  48. new
  49. 150+5 , 400 -50);
  50. 150+45, 400 - 50);
  51. 150+30, 460 - 50);
  52. 150+20, 460 - 50);
  53. path.close();
  54. canvas.drawPath(path, mPaint);

  55. }
  56. }
  57. }

package cn.m15.xys;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.RectF;import android.os.Bundle;import android.view.View;public class Geometry extends Activity { public int mScreenWidth = 0; public int mScreenHeight = 0; @Override protected void onCreate(Bundle savedInstanceState) {setContentView(new GeometryView(this));super.onCreate(savedInstanceState); } class GeometryView extends View {Paint mPaint = null;public GeometryView(Context context) { super(context); mPaint = new Paint(); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);}@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); //设置画布颜色 也就是背景颜色 canvas.drawColor(Color.WHITE); mPaint.setColor(Color.BLACK); canvas.drawText("绘制无规则几何图形喔!!!", 150, 30, mPaint); //绘制一条线 mPaint.setColor(Color.BLACK); mPaint.setStrokeWidth(4); canvas.drawLine(0, 0, 100, 100, mPaint); //绘制一个矩形 mPaint.setColor(Color.YELLOW); canvas.drawRect(0, 120, 100, 200, mPaint); //绘制一个圆形 mPaint.setColor(Color.BLUE); canvas.drawCircle(80, 300, 50, mPaint); //绘制一个椭圆 mPaint.setColor(Color.CYAN); canvas.drawOval(new RectF(300,370,120,100), mPaint); //绘制多边形 mPaint.setColor(Color.BLACK); Path path = new Path(); path.moveTo(150+5 , 400 -50); path.lineTo(150+45, 400 - 50); path.lineTo(150+30, 460 - 50); path.lineTo(150+20, 460 - 50); path.close(); canvas.drawPath(path, mPaint); } }}


3.图片的绘制以及旋转缩放的实现




        在这点上Android 确实比J2ME 强大很多  手机游戏开发最痛苦的是什么?? 是游戏引擎的开发,但是工程师会把大部分时间浪费在对坐标上,如果写引擎的时候没有把自适应考虑周全后期会非常痛苦,现在手机屏幕分辨率是各式各样 内存大小也是各式各样 所以可见自适应屏幕算法有多么的重要。







​view plain​​​ ​​copy to clipboard​​​ ​​print​​​ ​​?​


  1. package

  2. import
  3. import
  4. import
  5. import
  6. import
  7. import
  8. import
  9. import
  10. import
  11. import
  12. import
  13. import

  14. public class Image extends
  15. null;

  16. @Override
  17. protected void
  18. new ImageView(this);
  19. setContentView(R.layout.image);
  20. LinearLayout ll = (LinearLayout) findViewById(R.id.iamgeid);
  21. ll.addView(imageView);
  22. // 向左移动
  23. Button botton0 = (Button) findViewById(R.id.buttonLeft);
  24. new
  25. @Override
  26. public void
  27. imageView.setPosLeft();
  28. }
  29. });

  30. // 向右移动
  31. Button botton1 = (Button) findViewById(R.id.buttonRight);
  32. new
  33. @Override
  34. public void
  35. imageView.setPosRight();
  36. }
  37. });
  38. // 左旋转
  39. Button botton2 = (Button) findViewById(R.id.buttonRotationLeft);
  40. new
  41. @Override
  42. public void
  43. imageView.setRotationLeft();
  44. }
  45. });

  46. // 右旋转
  47. Button botton3 = (Button) findViewById(R.id.buttonRotationRight);
  48. new
  49. @Override
  50. public void
  51. imageView.setRotationRight();
  52. }
  53. });

  54. // 缩小
  55. Button botton4 = (Button) findViewById(R.id.buttonNarrow);
  56. new

  57. @Override
  58. public void
  59. imageView.setNarrow();
  60. }
  61. });

  62. // 放大
  63. Button botton5 = (Button) findViewById(R.id.buttonEnlarge);
  64. new

  65. @Override
  66. public void
  67. imageView.setEnlarge();
  68. }
  69. });

  70. super.onCreate(savedInstanceState);

  71. }

  72. class ImageView extends
  73. null;
  74. null;
  75. null;
  76. int m_posX = 120;
  77. int m_posY = 50;
  78. int m_bitMapWidth = 0;
  79. int m_bitMapHeight = 0;
  80. null;
  81. float mAngle = 0.0f;
  82. float mScale = 1f;//1为原图的大小

  83. public
  84. super(context);
  85. new
  86. mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  87. this.getResources(),
  88. R.drawable.image);
  89. bitMapDisplay = bitMap;
  90. new
  91. // 获取图片宽高
  92. m_bitMapWidth = bitMap.getWidth();
  93. m_bitMapHeight = bitMap.getHeight();
  94. }

  95. // 向左移动
  96. public void
  97. 10;
  98. }

  99. // 向右移动
  100. public void
  101. 10;
  102. }

  103. // 向左旋转
  104. public void
  105. mAngle--;
  106. setAngle();
  107. }

  108. // 向右旋转
  109. public void
  110. mAngle++;
  111. setAngle();
  112. }

  113. // 缩小图片
  114. public void
  115. if (mScale > 0.5) {
  116. 0.1;
  117. setScale();
  118. }
  119. }

  120. // 放大图片
  121. public void
  122. if (mScale < 2) {
  123. 0.1;
  124. setScale();
  125. }
  126. }

  127. // 设置缩放比例
  128. public void
  129. mMatrix.reset();
  130. mMatrix.setRotate(mAngle);
  131. 0, 0, m_bitMapWidth,
  132. true);
  133. }

  134. // 设置旋转比例
  135. public void
  136. mMatrix.reset();
  137. //float sx X轴缩放
  138. //float sy Y轴缩放
  139. mMatrix.postScale(mScale, mScale);
  140. 0, 0, m_bitMapWidth,
  141. true);
  142. }

  143. @Override
  144. protected void
  145. super.onDraw(canvas);
  146. canvas.drawBitmap(bitMapDisplay, m_posX, m_posY, mPaint);
  147. invalidate();
  148. }
  149. }
  150. }

package cn.m15.xys;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;public class Image extends Activity { ImageView imageView = null; @Override protected void onCreate(Bundle savedInstanceState) {imageView = new ImageView(this);setContentView(R.layout.image);LinearLayout ll = (LinearLayout) findViewById(R.id.iamgeid);ll.addView(imageView);// 向左移动Button botton0 = (Button) findViewById(R.id.buttonLeft);botton0.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {imageView.setPosLeft(); }});// 向右移动Button botton1 = (Button) findViewById(R.id.buttonRight);botton1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {imageView.setPosRight(); }});// 左旋转Button botton2 = (Button) findViewById(R.id.buttonRotationLeft);botton2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {imageView.setRotationLeft(); }});// 右旋转Button botton3 = (Button) findViewById(R.id.buttonRotationRight);botton3.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {imageView.setRotationRight(); }});// 缩小Button botton4 = (Button) findViewById(R.id.buttonNarrow);botton4.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {imageView.setNarrow(); }});// 放大Button botton5 = (Button) findViewById(R.id.buttonEnlarge);botton5.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {imageView.setEnlarge(); }});super.onCreate(savedInstanceState); } class ImageView extends View {Paint mPaint = null;Bitmap bitMap = null;Bitmap bitMapDisplay = null;int m_posX = 120;int m_posY = 50;int m_bitMapWidth = 0;int m_bitMapHeight = 0;Matrix mMatrix = null;float mAngle = 0.0f;float mScale = 1f;//1为原图的大小public ImageView(Context context) { super(context); mPaint = new Paint(); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); bitMap = BitmapFactory.decodeResource(this.getResources(), R.drawable.image); bitMapDisplay = bitMap; mMatrix = new Matrix(); // 获取图片宽高 m_bitMapWidth = bitMap.getWidth(); m_bitMapHeight = bitMap.getHeight();}// 向左移动public void setPosLeft() { m_posX -= 10;}// 向右移动public void setPosRight() { m_posX += 10;}// 向左旋转public void setRotationLeft() { mAngle--; setAngle();}// 向右旋转public void setRotationRight() { mAngle++; setAngle();}// 缩小图片public void setNarrow() { if (mScale > 0.5) {mScale -= 0.1;setScale(); }}// 放大图片public void setEnlarge() { if (mScale < 2) {mScale += 0.1;setScale(); }}// 设置缩放比例public void setAngle() { mMatrix.reset(); mMatrix.setRotate(mAngle); bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth, m_bitMapHeight, mMatrix, true);}// 设置旋转比例public void setScale() { mMatrix.reset(); //float sx X轴缩放 //float sy Y轴缩放 mMatrix.postScale(mScale, mScale); bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth, m_bitMapHeight, mMatrix, true);}@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bitMapDisplay, m_posX, m_posY, mPaint); invalidate();} }}

​view plain​​​ ​​copy to clipboard​​​ ​​print​​​ ​​?​


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/iamgeid"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >
  8. <Button android:id="@+id/buttonLeft"
  9. android:layout_width="fill_parent" android:layout_height="wrap_content"
  10. android:text="图片向左移动"
  11. />
  12. <Button android:id="@+id/buttonRight"
  13. android:layout_width="fill_parent" android:layout_height="wrap_content"
  14. android:text="图片向右移动"
  15. />
  16. <Button android:id="@+id/buttonRotationLeft"
  17. android:layout_width="fill_parent" android:layout_height="wrap_content"
  18. android:text="图片左旋转"
  19. />
  20. <Button android:id="@+id/buttonRotationRight"
  21. android:layout_width="fill_parent" android:layout_height="wrap_content"
  22. android:text="图片右旋转"
  23. />
  24. <Button android:id="@+id/buttonNarrow"
  25. android:layout_width="fill_parent" android:layout_height="wrap_content"
  26. android:text="图片缩小"
  27. />
  28. <Button android:id="@+id/buttonEnlarge"
  29. android:layout_width="fill_parent" android:layout_height="wrap_content"
  30. android:text="图片放大"
  31. />
  32. </LinearLayout>

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/iamgeid" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/buttonLeft" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图片向左移动" /> <Button android:id="@+id/buttonRight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图片向右移动" /> <Button android:id="@+id/buttonRotationLeft" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图片左旋转" /> <Button android:id="@+id/buttonRotationRight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图片右旋转" /> <Button android:id="@+id/buttonNarrow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图片缩小" /> <Button android:id="@+id/buttonEnlarge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图片放大" /></LinearLayout>

4.播放frame动画




        做游戏的话播放动画可就是必不可少的元素 帧动画帧动画 顾名思义是一帧一帧的播放 。 实际在开发中为了节省内存美术会把人物的图片切成一小块一小块然后由程序根据编辑器生成的点把图片在拼接起来这样就可以做到用更少的图片去实现更多的动画效果因为不太方便介绍图片编辑器 这个demo我只给大家简单的介绍一下播放动画的原理 后期我会深入讲解。

               如图所示这个小人一直在行走 实际上是4张图片在来回切换 每张图片延迟500毫秒 后播下一张 以此类推。




       



​view plain​​​ ​​copy to clipboard​​​ ​​print​​​ ​​?​


  1. package

  2. import
  3. import
  4. import
  5. import
  6. import
  7. import
  8. import
  9. import
  10. import

  11. public class FramAnimation extends
  12. public final static int ANIM_COUNT = 4;

  13. @Override
  14. protected void
  15. new FramView(this));
  16. super.onCreate(savedInstanceState);

  17. }

  18. class FramView extends
  19. new
  20. null;
  21. null;
  22. long startTime = 0;
  23. int playID = 0;

  24. public
  25. super(context);
  26. for (int i = 0; i < ANIM_COUNT; i++) {
  27. this.getResources(),
  28. R.drawable.hero_a + i);
  29. }
  30. 0];
  31. new
  32. startTime = System.currentTimeMillis();
  33. }

  34. @Override
  35. protected void
  36. super.onDraw(canvas);
  37. paint.setColor(Color.WHITE);
  38. "播放动画中...", 100, 30, paint);
  39. long
  40. if (nowTime - startTime >= 500) {
  41. startTime=nowTime;
  42. playID++;
  43. if
  44. 0;
  45. }
  46. 100, 100, paint);
  47. }
  48. invalidate();
  49. }
  50. }

  51. }

标签:canvas,自定义,Button,mPaint,import,Android,View,public,android
From: https://blog.51cto.com/jdsjlzx/5733470

相关文章

  • Android 设置主题实现点击波纹效果
    开头先说说大家都知道的MaterialDesign。这里推荐​​大苞米​​的系列博客,介绍的很全面。MaterialDesign:MaterialDesign是Google推出的一个全新的设计语言,它的特点就是......
  • Android中 android:gravity 和 android:layout_gravity的区别
    在配置xml布局时,经常用到 android:gravity 和 android:layout_gravity这两个属性,这里记录一下他们的区别。1.android:gravity android:gravity常用于控制view的内部......
  • Action Bar使用方法 - Android活动栏(一)
     ActionBar主要功能包含: 1.显示选项菜单 2.提供标签页的切换方式的导航功能,可以切换多个fragment. 3. 提供下拉的导航条目. 4.提供交互式活动视图代替选......
  • Android如何判断应用程序是安装在手机内存中还是SD卡
    /***判断包名所对应的应用是否安装在SD卡上*@parampackageName*@return,trueifinstallonSDcard*/publicstaticbooleanisInstallOnSDCard(Stringpac......
  • Android 创建与解析XML(一)—— 概述
    Android是最常用的智能手机平台,XML是数据交换的标准媒介,Android中可以使用标准的XML生成器、解析器、转换器API,对XML进行解析和转换。XML,相关有DOM、SAX、JDOM、DOM......
  • Android 滑动效果基础篇(三)—— Gallery仿图像集浏览
    Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好。本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图......
  • Android 滑动效果入门篇(一)—— ViewFlipper
    ​​​ViewFilpper​​ 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放。又ViewAnimator继承至于FrameLayout......
  • Android 滑动效果入门篇(二)—— Gallery
    ​​​Gallery​​ 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果。从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我们可以......
  • Android 使用Gallery实现Tab
    main.xml布局文件: Java代码​​​​1.<?xmlversion="1.0"encoding="utf-8"?>2.<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/androi......
  • Android Asynchronous HTTPClient的实现和优化
    大家知道Android对UI线程的反应时间要求很高,超过5秒钟直接ANR掉,根本不给你机会多等。而Android应用与后端系统的交互是最基本的需求之一,如何实现高效的AsynchronousHTTPCli......