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

Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客

雨松MOMO带大家盘点Android 中的自定义View界面的绘制

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

1.自定义view绘制字符串

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

  1. package cn.m15.xys;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.graphics.Paint.FontMetrics;
  8. import android.os.Bundle;
  9. import android.view.Display;
  10. import android.view.View;
  11. public class Font extends Activity {
  12. public int mScreenWidth = 0;
  13. public int mScreenHeight = 0;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. setContentView(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 View {
  24. public final static String STR_WIDTH = "获取字符串宽为:";
  25. public final static String STR_HEIGHT = "获取字体高度为:";
  26. Paint mPaint = null;
  27. public FontView(Context context) {
  28. super(context);
  29. mPaint = new Paint();
  30. }
  31. @Override
  32. protected void onDraw(Canvas canvas) {
  33. //设置字符串颜色
  34. mPaint.setColor(Color.WHITE);
  35. canvas.drawText("当前屏幕宽" + mScreenWidth, 0, 30, mPaint);
  36. canvas.drawText("当前屏幕高"+ mScreenHeight, 0, 60, mPaint);
  37. //设置字体大小
  38. mPaint.setColor(Color.RED);
  39. mPaint.setTextSize(18);
  40. canvas.drawText("字体大小为18", 0, 90, mPaint);
  41. //消除字体锯齿
  42. mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  43. canvas.drawText("消除字体锯齿后", 0, 120, mPaint);
  44. //获取字符串宽度
  45. canvas.drawText(STR_WIDTH + getStringWidth(STR_WIDTH), 0, 150, mPaint);
  46. //获取字体高度
  47. canvas.drawText(STR_HEIGHT + getFontHeight(), 0, 180, mPaint);
  48. //从string.xml读取字符串绘制
  49. mPaint.setColor(Color.YELLOW);
  50. canvas.drawText(getResources().getString(R.string.string_font), 0, 210, mPaint);
  51. super.onDraw(canvas);
  52. }
  53. /**
  54. * 获取字符串宽
  55. * @param str
  56. * @return
  57. */
  58. private int getStringWidth(String str) {
  59. return (int) mPaint.measureText(STR_WIDTH);
  60. }
  61. /*
  62. * 获取字体高度
  63. */
  64. private int getFontHeight() {
  65. FontMetrics fm = mPaint.getFontMetrics();
  66. return (int)Math.ceil(fm.descent - fm.top) + 2;
  67. }
  68. }
  69. }

2.绘制无规则几何图形

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

  1. package cn.m15.xys;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.graphics.Path;
  8. import android.graphics.RectF;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. public class Geometry extends Activity {
  12. public int mScreenWidth = 0;
  13. public int mScreenHeight = 0;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. setContentView(new GeometryView(this));
  17. super.onCreate(savedInstanceState);
  18. }
  19. class GeometryView extends View {
  20. Paint mPaint = null;
  21. public GeometryView(Context context) {
  22. super(context);
  23. mPaint = new Paint();
  24. mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  25. }
  26. @Override
  27. protected void onDraw(Canvas canvas) {
  28. super.onDraw(canvas);
  29. //设置画布颜色 也就是背景颜色
  30. canvas.drawColor(Color.WHITE);
  31. mPaint.setColor(Color.BLACK);
  32. canvas.drawText("绘制无规则几何图形喔!!!", 150, 30, mPaint);
  33. //绘制一条线
  34. mPaint.setColor(Color.BLACK);
  35. mPaint.setStrokeWidth(4);
  36. canvas.drawLine(0, 0, 100, 100, mPaint);
  37. //绘制一个矩形
  38. mPaint.setColor(Color.YELLOW);
  39. canvas.drawRect(0, 120, 100, 200, mPaint);
  40. //绘制一个圆形
  41. mPaint.setColor(Color.BLUE);
  42. canvas.drawCircle(80, 300, 50, mPaint);
  43. //绘制一个椭圆
  44. mPaint.setColor(Color.CYAN);
  45. canvas.drawOval(new RectF(300,370,120,100), mPaint);
  46. //绘制多边形
  47. mPaint.setColor(Color.BLACK);
  48. Path path = new Path();
  49. path.moveTo(150+5 , 400 -50);
  50. path.lineTo(150+45, 400 - 50);
  51. path.lineTo(150+30, 460 - 50);
  52. path.lineTo(150+20, 460 - 50);
  53. path.close();
  54. canvas.drawPath(path, mPaint);
  55. }
  56. }
  57. }

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

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

  1. package cn.m15.xys;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Matrix;
  8. import android.graphics.Paint;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.Button;
  13. import android.widget.LinearLayout;
  14. public class Image extends Activity {
  15. ImageView imageView = null;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. imageView = 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. botton0.setOnClickListener(new OnClickListener() {
  25. @Override
  26. public void onClick(View arg0) {
  27. imageView.setPosLeft();
  28. }
  29. });
  30. // 向右移动
  31. Button botton1 = (Button) findViewById(R.id.buttonRight);
  32. botton1.setOnClickListener(new OnClickListener() {
  33. @Override
  34. public void onClick(View arg0) {
  35. imageView.setPosRight();
  36. }
  37. });
  38. // 左旋转
  39. Button botton2 = (Button) findViewById(R.id.buttonRotationLeft);
  40. botton2.setOnClickListener(new OnClickListener() {
  41. @Override
  42. public void onClick(View arg0) {
  43. imageView.setRotationLeft();
  44. }
  45. });
  46. // 右旋转
  47. Button botton3 = (Button) findViewById(R.id.buttonRotationRight);
  48. botton3.setOnClickListener(new OnClickListener() {
  49. @Override
  50. public void onClick(View arg0) {
  51. imageView.setRotationRight();
  52. }
  53. });
  54. // 缩小
  55. Button botton4 = (Button) findViewById(R.id.buttonNarrow);
  56. botton4.setOnClickListener(new OnClickListener() {
  57. @Override
  58. public void onClick(View arg0) {
  59. imageView.setNarrow();
  60. }
  61. });
  62. // 放大
  63. Button botton5 = (Button) findViewById(R.id.buttonEnlarge);
  64. botton5.setOnClickListener(new OnClickListener() {
  65. @Override
  66. public void onClick(View arg0) {
  67. imageView.setEnlarge();
  68. }
  69. });
  70. super.onCreate(savedInstanceState);
  71. }
  72. class ImageView extends View {
  73. Paint mPaint = null;
  74. Bitmap bitMap = null;
  75. Bitmap bitMapDisplay = null;
  76. int m_posX = 120;
  77. int m_posY = 50;
  78. int m_bitMapWidth = 0;
  79. int m_bitMapHeight = 0;
  80. Matrix mMatrix = null;
  81. float mAngle = 0.0f;
  82. float mScale = 1f;//1为原图的大小
  83. public ImageView(Context context) {
  84. super(context);
  85. mPaint = new Paint();
  86. mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
  87. bitMap = BitmapFactory.decodeResource(this.getResources(),
  88. R.drawable.image);
  89. bitMapbitMapDisplay = bitMap;
  90. mMatrix = new Matrix();
  91. // 获取图片宽高
  92. m_bitMapWidth = bitMap.getWidth();
  93. m_bitMapHeight = bitMap.getHeight();
  94. }
  95. // 向左移动
  96. public void setPosLeft() {
  97. m_posX -= 10;
  98. }
  99. // 向右移动
  100. public void setPosRight() {
  101. m_posX += 10;
  102. }
  103. // 向左旋转
  104. public void setRotationLeft() {
  105. mAngle--;
  106. setAngle();
  107. }
  108. // 向右旋转
  109. public void setRotationRight() {
  110. mAngle++;
  111. setAngle();
  112. }
  113. // 缩小图片
  114. public void setNarrow() {
  115. if (mScale > 0.5) {
  116. mScale -= 0.1;
  117. setScale();
  118. }
  119. }
  120. // 放大图片
  121. public void setEnlarge() {
  122. if (mScale < 2) {
  123. mScale += 0.1;
  124. setScale();
  125. }
  126. }
  127. // 设置缩放比例
  128. public void setAngle() {
  129. mMatrix.reset();
  130. mMatrix.setRotate(mAngle);
  131. bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth,
  132. m_bitMapHeight, mMatrix, true);
  133. }
  134. // 设置旋转比例
  135. public void setScale() {
  136. mMatrix.reset();
  137. //float sx X轴缩放
  138. //float sy Y轴缩放
  139. mMatrix.postScale(mScale, mScale);
  140. bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth,
  141. m_bitMapHeight, mMatrix, true);
  142. }
  143. @Override
  144. protected void onDraw(Canvas canvas) {
  145. super.onDraw(canvas);
  146. canvas.drawBitmap(bitMapDisplay, m_posX, m_posY, mPaint);
  147. invalidate();
  148. }
  149. }
  150. }
  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>

4.播放frame动画

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

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

  1. package cn.m15.xys;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. public class FramAnimation extends Activity {
  12. public final static int ANIM_COUNT = 4;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. setContentView(new FramView(this));
  16. super.onCreate(savedInstanceState);
  17. }
  18. class FramView extends View {
  19. Bitmap[] bitmap = new Bitmap[ANIM_COUNT];
  20. Bitmap display = null;
  21. Paint paint = null;
  22. long startTime = 0;
  23. int playID = 0;
  24. public FramView(Context context) {
  25. super(context);
  26. for (int i = 0; i < ANIM_COUNT; i++) {
  27. bitmap[i] = BitmapFactory.decodeResource(this.getResources(),
  28. R.drawable.hero_a + i);
  29. }
  30. display = bitmap[0];
  31. paint = new Paint();
  32. startTime = System.currentTimeMillis();
  33. }
  34. @Override
  35. protected void onDraw(Canvas canvas) {
  36. super.onDraw(canvas);
  37. paint.setColor(Color.WHITE);
  38. canvas.drawText("播放动画中...", 100, 30, paint);
  39. long nowTime = System.currentTimeMillis();
  40. if (nowTime - startTime >= 500) {
  41. startTime=nowTime;
  42. playID++;
  43. if (playID >= ANIM_COUNT) {
  44. playID = 0;
  45. }
  46. canvas.drawBitmap(bitmap[playID], 100, 100, paint);
  47. }
  48. invalidate();
  49. }
  50. }
  51. }

最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习

雨松MOMO希望可以和大家一起进步。

下载地址:http://download.csdn.net/source/3448152

时间: 2024-10-13 23:27:38

Android软件开发之盘点自定义View界面大合集(二)的相关文章

Android软件开发之盘点所有Dialog对话框大合集(一)

Android软件开发之盘点所有Dialog对话框大合集(一) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的对话框 今天我用自己写的一个Demo 和大家详细介绍一个Android中的对话框的使用技巧.   1.确定取消对话框 对话框中有2个按钮 通过调用 setPositiveButton 方法 和 setNegativeButton 方法 可以设置按钮的显示内容以及按钮的监听事件.   我们使用AlerDialog 创建对话框 AlertDia

Android软件开发之盘点所有Dialog对话框大合集

对话框大合集 今天我用自己写的一个Demo 和大家详细介绍一个Android中的对话框的使用技巧. <ignore_js_op> 1.确定取消对话框 对话框中有2个按钮   通过调用 setPositiveButton 方法 和 setNegativeButton 方法 可以设置按钮的显示内容以及按钮的监听事件.<ignore_js_op> 我们使用AlerDialog 创建对话框 AlertDialog.Builder builder = new AlertDialog.Buil

Android 软件开发与游戏开发1 至 32系列博文大合集

Android 软件开发与游戏开发1 至 32系列博文大合集Android 软件开发与游戏开发1 至 32系列博文大合集 http://www.qdmm.com/BookReader/17958,65822595.aspxhttp://www.qdmm.com/BookReader/17958,65822597.aspxhttp://www.qdmm.com/BookReader/17958,65822598.aspxhttp://www.qdmm.com/BookReader/17958,65

Android Studio开发基础之自定义View组件

一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自android.view.View类的View类,并且重写构造方法. 如下,新建一个名为MyView.Java的Java类文件,重写一个带Context的构造方法和onDraw()方法(用来重新绘制Activity窗口的背景). package com.example.lhb.contentprovid

Android逆向-Android逆向基础10(so文件分析大合集)

0x00 前言 导航 博客导航戳这里练习资源戳这里 说明 在so文件的分析上,我们需要对一些ARM汇编的逻辑实现.在代码逻辑上,只对if,switch,还有循环进行一个demo分析和创建.可能会篇幅比较大. 内容 1.if逻辑NDK编程2.if逻辑ARM分析3.switch逻辑NDK编程4.switch逻辑ARM分析5.循环逻辑NDK编程6.循环逻辑ARM分析 0x01 if逻辑NDK编程 demo使用之前的demo,如果有兴趣,可以去看看博客导航戳这里 说明 demo主要实现一个输入,然后根据

基于OpenCV的Android软件开发

最近在做Android软件开发,手头有一些C.OpenCV版本的代码想移植到手机中,于是调查了OpenCV在Android中的使用方法,总结如下. 我使用的Android软件开发环境为Android ADT(Android Developer Tools),它包含了Android软件开发必备的开发插件,下载下来解压就能用.对于编译C/C++ Android Native代码开发,需要NDK,也是下载下来解压,在eclipse里配置一下路径即可,如下图(Window->Preferences).

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

万树IT:Android软件开发必学习的0基础内容

如今安卓系统中国的前景市场是非常广阔的,它主要针对的是移动设备市场,而如今智能手机已经占据人们生活不能缺少的一部分.所以,很多行业投入到安卓软件开发,进入到安卓开发的人才也越来越多. 安卓应用软件开发必学习的5大基础内容: 1.编程语言 2.基础应用开发 3.核心组件开发Android论坛交流 4丶安卓论坛交流学习 5.深入开发 Android软件开发必学习的0基础内容 1.编程语言的学习 安卓应用软件开发中有很多的编程语言可以使用,所以应该重点学习以下几种编程语言. ①  C/C++语言.  

Android 应用开发中如何自定义 Drawable 背景?

2020-02-06 关键字:EditText自定义背景.shape.corners 通过 xml 定义 View 的背景 Drawable 资源还是挺常用的. 本篇博文记录几种常用的自定义 Drawable 方式. 1.圆角矩形 A.普通圆角矩形 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/