最经在Android上作游戏居多了,在Android平台做游戏和做应用少有少许的不同,做游戏就会更多的使用自定义视图了,有很多东西需要我们自己去实现,就不像做应用,用得最多的就是Android系统的一些组件,当然偶尔也会涉及到自定义一些界面,但是这些自定义界面都是使用系统的一些组件来组合完成了,而游戏不同了,游戏在图形的处理上要求会更多,这时,自定义视图就派上用场了。

说老实话,做了几个游戏出来之后,才发现,以前要实现某个功能会经过很多的步骤并且很复杂,在Android就可以很轻松的解决,比如最简单的一个渐变色的处理,要是在J2ME上计算就会多很多,在Android就需要定义一个shape的XML文件即可,同时还可以利用shape来绘制一些基本的图形(有机会右面会介绍这个shape),甚至代替很多图片内容,这样既节省了空间,又提高了效率,为什么不好呢?Android真的很强大,主要是很灵活,我们可以用很多方法去实现某个功能。

好了,又废话了这么多,下面进入正题。

我们都知道Android的UI,都是基于View和ViewGroup以及一些子类,比如layout等等,所以我们在自定义视图时就需要将自定义的类继承自这个类。

首先我们需要在values目录下建立一个attrs.xml文件,来定义我们在自定义视图中需要使用的一些资源,比如:背景、字体大小、字体等等。代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="TestView">
  4. <attr name="textColor" format="color" />
  5. <attr name="textSize" format="dimension" />
  6. <attr name="backGround" format="integer" />
  7. </declare-styleable>
  8. </resources>

上面的代码很好理解,我们将自定义的试图名定位TestView,其中包括了字体颜色(textColor),字体尺寸(textSize)以及背景(backGround)。
接下来我们就需要建立一个类TestView,继承自View了。 
代码如下(代码加入了注释,这里就不多说了):

  1. package com.yarin.Android.Test;
  2. import android.content.Context;
  3. import android.content.res.TypedArray;
  4. import android.graphics.Canvas;
  5. import android.graphics.Paint;
  6. import android.util.AttributeSet;
  7. import android.view.View;
  8. public class TestView extends View
  9. {
  10. private Paint   mPaint      = null;
  11. private Context     mContext    = null;
  12. /**
  13. *  mTestView = new TestView(this);
  14. *  setContentView(mTestView);
  15. *  如果在Activity中这样写,那么就需要实现这个构造函数
  16. */
  17. public TestView(Context context)
  18. {
  19. super(context);
  20. mContext = context;
  21. mPaint = new Paint();
  22. }
  23. /**
  24. *  setContentView(R.layout.main);
  25. *  mTestView = (TestView)findViewById(R.id.mTestView);
  26. *  如果在Activity中这样写,那么就需要实现这个构造函数
  27. */
  28. public TestView(Context context, AttributeSet attrs)
  29. {
  30. super(context, attrs);
  31. mContext = context;
  32. mPaint = new Paint();
  33. TypedArray params = context.obtainStyledAttributes(attrs,R.styleable.TestView);
  34. //取得xml布局文件中所定义的背景
  35. int backgroudId = params.getResourceId(R.styleable.TestView_backGround,0);
  36. if (backgroudId != 0)
  37. {
  38. setBackgroundResource(backgroudId);
  39. }
  40. //字体颜色
  41. int textColor = params.getColor(R.styleable.TestView_textColor,0XFFFFFFFF);
  42. mPaint.setColor(textColor);
  43. //字体大小
  44. float textSize = params.getDimension(R.styleable.TestView_textSize, 20);
  45. mPaint.setTextSize(textSize);
  46. }
  47. protected void onDraw(Canvas canvas)
  48. {
  49. super.onDraw(canvas);
  50. //测试绘制一个矩形
  51. canvas.drawRect(30, 50, 80, 90, mPaint);
  52. //绘制一个字符串
  53. canvas.drawText("测试字符串", 50, 150, mPaint);
  54. }
  55. }

接下来,我们需要在main.xml中来修改加入自定义视图了,修改如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:test="http://schemas.android.com/apk/res/com.yarin.Android.Test"
  5. android:orientation="vertical"
  6. android:layout_width="fill_parent"
  7. android:layout_height="fill_parent"
  8. >
  9. <TextView
  10. android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"
  12. android:text="@string/hello"
  13. />
  14. <!-- 自定义视图
  15. 注意这里是如何来申明自定义视图中的字体颜色、字体大小、背景的,
  16. 在线性布局中不要忘记“xmlns:test="http://schemas.android.com/apk/res/com.yarin.Android.Test”
  17. -->
  18. <com.yarin.Android.Test.TestView
  19. android:id="@+id/mTestView"
  20. android:layout_width="fill_parent"
  21. android:layout_height="fill_parent"
  22. test:textColor="#FFFFFFFF"
  23. test:textSize="25dip"
  24. test:backGround="@drawable/bg"
  25. />
  26. </LinearLayout>

最后在Activity中,不管我们采用下面那一种方式来写都可以了:

  1. //mTestView = new TestView(this);
  2. //setContentView(mTestView);
  3. setContentView(R.layout.main);
  4. mTestView = (TestView)findViewById(R.id.mTestView);

大家可以从代码看出,我们在屏幕上绘制了一个矩形和一个字符串做测试。效果如下(这个效果是在OPhone1.0上测试的):

也没什么多说的,网络上已经早已有方法你来讲解了,就算自己作个记录吧,能帮助到某个朋友,当然很高兴,下面是Eclipse工程文件。

需要说明一下,3D的应用时不能这样的,3D需要使用SurfaceView来实现,后面有时间在介绍。最后总结一点经验,Android上开发应用,最主要的就是UI界面的布局,其他的都好解决,正在努力想UI的布局有没有更好的方式。

谢谢大家支持。

本文转自 yarin 51CTO博客,原文链接:http://blog.51cto.com/yarin/381936,如需转载请自行联系原作者

Android\OPhone自定义视图(View)相关推荐

  1. Android中自定义视图View

    标签: 前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用 ...

  2. Android中自定义视图View之---前奏篇

    前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自 ...

  3. Android Studio自定义视图无法预览

    Android Studio自定义视图没有办法预览 我想大家应该都和我一样,如果看到布局的编码的时候如果右边能够非常直观地显示出对应的视图,心里会非常舒心,像官方提供的tools命名空间就是为了这个目 ...

  4. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  5. 【eoe教程】Android中自定义视图的绘制方法

    原文链接 :http://android.eoe.cn/topic/ui 自定义视图最重要的部分是它的外观.你可以根据应用的需求简单或复杂的实现它. 这个教程包含了最常见的操作. 重写onDraw() ...

  6. android原生自定义头像View

    android原生自定义两种头像方式 第一种.不带圆形外圈头像 package com.activitytest.pengintohospital.utils;import android.conte ...

  7. Android开发自定义的View

    2019独角兽企业重金招聘Python工程师标准>>> 当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的 ...

  8. Qt模型model、视图view、代理

    例子为qt5应用及实例第8章 MVC是一种与用户界面相关的设计模式.通过使用此模型,可以有效地分离数据和用户界面.MVC设计模式包含三要素:表示数据的模型(Model).表示用户界面的视图(View) ...

  9. Android自定义视图四:定制onMeasure强制显示为方形

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  10. android面试自定义view,资深面试官:自定义View的实现方式,你知道几种?

    前提 为什么要自定义View? 怎么自定义View? 当 Android SDK 中提供的系统 UI 控件无法满足业务需求时,我们就需要考虑自己实现 UI 控件.而且自定义View在面试时是很经典的一 ...

最新文章

  1. 实用的4W、5V直流开关稳压电源电路图及解析
  2. 虚拟化技术中,为什么说容器技术暂时将不会取代虚拟机模式
  3. 写的py_ping 可以跑了
  4. TCP 三次握手过程详解
  5. 跟着鸟哥学Linux系列笔记1
  6. Asp.Net 学习资源列表(转)
  7. react-事件相关
  8. matlab sdk7.1,免费试用MATLAB Compiler SDK
  9. 利用CMD在vim中直接编译
  10. 一个开源vue网站博客,nuxt开源网站,前后端分离项目
  11. 使用Bigemap下载地图生成GST(Mapinfo格式)地图包
  12. 【RT-Thread 作品秀】空气质量监测系统
  13. 秒搜神器everything背后的索引原理
  14. fid和is_【GAN】用于生成图像的评价指标——IS和FID
  15. Lee滤波和Refine-Lee滤波
  16. Python札记6_字典1
  17. 组织机构、权限、角色设计
  18. php检查数据库记录,php-检查数据库中是否有新条目
  19. HTTP/1.1(消息格式、连接管理、条件请求、范围请求、缓存、身份验证)
  20. SpringBoot Actuator

热门文章

  1. 谈谈Java中的集合
  2. flask_loginer
  3. [多线程系列]多线程之java线程池架构分析
  4. HBase Filter及对应Shell
  5. ImageView设置边框的两种方式
  6. 快速的mysql导入导出数据(load data和outfile)
  7. Java游戏开发框架LGame-0.2.6发布(含PC及Android版)
  8. 使用SDE的一点体会
  9. R语言空间插值的几种方法及案例应用
  10. Reading Thinking in Java #3