一、android 界面开发

1、三个重要的类:View视图、Canvas画布、Paint画笔
2、android 界面开发常用三种视图
  View            --只能在主线程中更新,没有缓存机制,适合画面更新较少的界面,比如有按键按下才变化的界面。
  SurfaceView --可以设置独立的线程,有缓存机制,主要用于2D游戏
  GLSurfaceView --主要用于3D游戏,暂时不学习

二、View框架

  同SWIMG、AWT一样,Android也提供大量的View组件给开发者,所有组件都是View的子类,包括以前介绍的常用控件和ViewGroup也是。ViewGroup是View的子类,所以它也具有View的特性,但它主要用来充当View的容器,将其中的View视作自己的孩子,对它的子View进行管理,当然它的孩子也可以是ViewGroup类型。ViewGroup(树根)和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接受和处理消息的功能,android系统所产生的消息会在这些ViewGroup和 View之间传递。

1、View类结构

java.lang.Object
-------android.view.View

直接子类:AnalogClock, ImageView, KeyboardView, ProgressBar, SurfaceView, TextView, ViewGroup, ViewStub

当然还有许多其他间接子类。

2、ViewGroup

  ViewGroup继承于View,它可以包含其他的View,就像一个View的容器,我们可以调用其成员函数addView()将View当作孩子放到ViewGroup中。

我们经常使用的LinearLayout、relativeLayout等都是ViewGroup的子类,ViewGroup类中有一个内部类ViewGroup.LayoutParams,我们经常使用LayoutParams的子类来构造布局参数。

  我们也可以自定义自己的布局,以方便日后使用和维护,这时我们就需要继承ViewGroup类并在派生类中重写ViewGroup的一些方法。

3、自定义View

  有些自带组件可能无法满足需求,这时候往往需要自定义View,一般只要主要底下两点就可以了。

  (1) 继承View

  (2) 重写感兴趣的方法

自定义View的常用方法:

  onFinishInflate() 当View中所有的子控件 均被映射成xml后触发

  onMeasure(int, int) 确定所有子元素的大小

  onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发

  onSizeChanged(int, int, int, int) 当view的大小发生变化时触发

  onDraw(Canvas) view渲染内容的细节

  onKeyDown(int, KeyEvent) 有按键按下后触发

  onKeyUp(int, KeyEvent) 有按键按下后弹起时触发

  onTrackballEvent(MotionEvent) 轨迹球事件

  onTouchEvent(MotionEvent) 触屏事件

  onFocusChanged(boolean, int, Rect) 当View获取 或失去焦点时触发

  onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发

  onAttachedToWindow() 当view被附着到一个窗口时触发

  onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和  onAttachedToWindow() 是相反的。

  onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发

4、View实例

  在View上 写"GameView" ,按方向键 上下左右会随之移动,触摸屏幕、拖动也会移到相应位置。

新建MyView类 继承View基类

 package com.example.gameview;

 import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View; public class MyView extends View { private int x=10,y=10; public MyView(Context context) {
super(context);
setFocusable(true);//设置当前view为焦点操作
// TODO Auto-generated constructor stub
} @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
Paint paint = new Paint();
paint.setColor(Color.BLACK);
canvas.drawText("GameView", x, y, paint); super.onDraw(canvas);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
y-=2;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
y+=2;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
x-=2;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
x+=2;
} invalidate();
//postInvalidate();
return super.onKeyDown(keyCode, event);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
return super.onKeyUp(keyCode, event);
} @Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
int tx = (int)event.getX();
int ty = (int)event.getY();
//玩家手指点击屏幕的动作
if (event.getAction() == MotionEvent.ACTION_DOWN) {
x = tx;
y = ty;
//玩家手指抬起离开屏幕的动作
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
x = tx;
y = ty;
//玩家手指在屏幕上移动的动作
} else if (event.getAction() == MotionEvent.ACTION_UP) {
x = tx;
y = ty;
}
// //获取用户手指触屏的X坐标赋值与文本的X坐标
// x = (int)event.getX();
// //获取用户手指触屏的Y坐标赋值与文本的Y坐标
// y = (int)event.getY();
// //重绘画布 //重绘画布
invalidate();
//postInvalidate();
return true;
} }

需要特别注意的知识点如下:

1、Activity全屏显示

 // 去掉Activity标题栏
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// 去掉 电量、时间等状态栏,全屏显示
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

也可以在AndroidManifest里设置

 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

2、设置模拟器方向键生效
C:\Users\XX\.android\avd\XX.avd
config.ini
hw.dPad=no,把no改成yes,如下:
hw.dPad=yes
重启模拟器即可
XX根据个人命名不同而不同

3、重写onDraw方法

 Paint paint = new Paint();// 画笔类
paint.setColor(Color.BLACK);// 初始画布为白色,设置画笔为黑色
canvas.drawText("GameView", x, y, paint);// 坐标无论横屏竖屏都是从右上角为 0,0点开始的 super.onDraw(canvas);

4、onKeyDown、onKeyUp、onTouchEvent
  分别表示按钮 按下、抬起、触摸屏幕的事件

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
  return super.onKeyDown(keyCode, event);
}

第一个参数为键值,手机中每一个按钮都拥有一个完全独立的键值 通过按键键值就可以确定当前按下的是那一个按键。
第二个参数为按键事件,  该对象中保存着当前按键的所有信息 比如 按键发生的时间 按键发生的次数  按键发生的类型等等。
通过以上两个参数就可以拿到当前按键事件的所附带的一切信息。

另外两个方法的参数也一样。

keyCode == KeyEvent.KEYCODE_DPAD_UP 表示 向上的方向键按下

其他方向键命名类似。

5、设置当前view为焦点操作才能进行操作

  在View中须要监听按键的话必需在构造方法中给当前View 设置控制焦点 须要调用 setFocusable(true); 如果没有设置的话 onKeyDown 与onKeyUp 等跟按键有关的 永远无法监听到按键事件。 在onKeyDown 与onKeyUp 通过keyCode 的值就可以判断当前按下那一个按键 ,然后根据event 事件对象就可以拿到当前触发事件的时间等等。

6、重画
  invalidate();// 重绘View树,即draw()过程,在UI主线程调用,不符合单线程安全设计模式
  postInvalidate(); //可在自己创建的线程 通过handler通知UI主线程调用

android学习日记06--View视图的更多相关文章

  1. android学习日记16--GridView(网格视图)

    一.GridView 1.简述 GridView按照行列来显示图片或文本的一种视图,排列其实有点类似TableLayout布局, 不过和TableLayout还是差别很大的,倒比较像二维的ListVi ...

  2. android学习日记15--WebView(网络视图)

    一.WebView 1.简述 WebView(网络视图)内置WebKit引擎,能加载显示网页,还支持JS,并且能够在Android平台使用AJAXWebView可以在布局中声明,也可以在Activit ...

  3. android学习日记17--Gallery(画廊视图)

    一.Gallery 1.简述 Gallery有道翻译为画廊,就叫它画廊控件,主要用来可切换的图片展示,左右滑动可以选择上一张或下一张图片. 个人感觉蛮实用的,不过google貌似不推荐使用啊! 2.常 ...

  4. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  5. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

  6. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  7. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  8. android学习日记06--SurfaceView视图

    一.API关SurfaceView的介绍 SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸.Surfacev ...

  9. android学习日记22--Animation动画简介

    Animation动画主要有两种:帧动画(Frame Animation)和补间动画(Tween Animation).补间动画主要包括对位置.角度.尺寸等属性的变化,而帧动画则是通过若干帧图片轮流切 ...

随机推荐

  1. JAVA分布式事务原理及应用

    JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目的是要 ...

  2. idea开发工具中你可能不知道的却又比较好用的快捷键

    Alt+insert :生成代码 较为常用的是 1.普通Class中生成get set 方法 .生成构造函数.生成spring注入.重写对象的equal.toString.hashcode方法 2.如 ...

  3. Java [leetcode 26]Remove Duplicates from Sorted Array

    题目描述: Given a sorted array, remove the duplicates in place such that each element appear only once a ...

  4. NET下RabbitMQ实践[示例篇]

    在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容.         今天将会介绍如果使用rabbitmq进行简单的消息入队, ...

  5. http://www.cnblogs.com/youfan/articles/3216816.html

    我对 CodeFirst 的理解,与之对应的有 ModelFirst与 DatabaseFirst ,三者各有千秋,依项目实际情况自行选择. 1.开发过程中先行设计数据库并依此在项目中生成 *.dbm ...

  6. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划查询(Ⅷ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划安排>,主要介绍整个施工计划列表与编辑界面. 下面看看施工计划查询(ⅠⅡⅢ ⅣⅤⅥ Ⅶ Ⅷ) 一.施工计划查询 ...

  7. C# 网页图片爬虫的几种技术基础

    一.文件流方式获取网络图片资源 方法1 , ); System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); System.Ne ...

  8. Windows内核编程之:分页内存与非分页内存 #define PAGEDCODE code_seg("PAGE") (转)

    原文链接:http://blog.chinaunix.net/uid-24504987-id-161192.html Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存 有些虚拟内 ...

  9. java创建对象的四种方式

    1.最常见的 new 一个 2使用反射机制创建对象,直接调用非构造函数 Class obj=Class.forName("A"); A a=obj.newInstance(); C ...

  10. bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...