android学习笔记(10)android中自定义View

2014-12-5 8:29:34     19 人阅读    

  前面已经提到,View组件的作用类似于Swing编程中的 JPanel,它只是一个矩形的空白区域,View组件没有任何内容。对于Android应用的其他UI组件来说,它们都继承了View组件,然后在View组件提供的空白区域上绘制外观。
     基于Android UI组件的实现原理,开发者完全可以开发出项目定制的组件——当Android 系统提供的UI组件不足以满足项目需要时,开发者可以通过继承View来派生自定义组件。

       当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的方法如下。

         构造器:重写构造器是定制View的最基本方式,当Java代码创建一个View实例,或根据XML布局文件加载并构建界面时将需要调用该构造器。

OnFinishlnflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用 它来构建界面之后,该方法就会被回调。
OnMeasure(int, int):调用该方法来检测View组件及它所包含的所有子组件的大小。
OnLayout(boolean, int, int, int, int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调。
onSizeChanged(int, int, int, int):当该组件的大小被改变时回调该方法。
onDraw(Canvas):当该组件将要绘制它的内容时回调该方法进行绘制。
onKeyDown(int, KeyEvent):当某个键被按下时触发该方法。
onKeyllp(int, KeyEvent):当松开某个键时触发该方法。
onTrackballEvent(MotionEvent):当发生轨迹球事件时触发该方法。
onTouchEvent(MotionEvent):当发生触摸屏事件时触发该方法。
onWindowFocusChanged(boolean):当该组件得到、失去焦点时触发该方法。
onAttachedToWindow():当把该组件放入某个窗口时触发该方法。
onDetachedFromWindow():当把该组件从某个窗口上分离时触发该方法。
onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法。 ^

        当需要开发自定义View时,开发者并不需要重写上面列出的所有方法,而是可以根据 业务需要重写上面的部分方法,例如下面的示例程序就只重写OnDraw(Carwas)方法。

实例:跟随手指的小球
        为了实现一个跟随手指的小球,我们考虑开发自定义的UI组件,这个UI组件将会在指定位置绘制一个小球,这个位置可以动态改变。当用户通过手指在屏幕上拖动时,程序监听到这个手机动作,并把手指动作的位置传入自定义UI组件,并通知该组件重绘即可。

下面是自定义组件的代码。
程序清单:DrawView.java

/**
 * 
 */
package org.crazyit.customview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;


public class DrawView extends View
{
 public float currentX = 40;
 public float currentY = 50;
 /**
  * @param context
  */
 public DrawView(Context context)
 {
  super(context);
  // TODO Auto-generated constructor stub
 }
 @Override
 public void onDraw (Canvas canvas)
 {
  super.onDraw(canvas);
  //创建画笔
  Paint p = new Paint();
  //设置画笔的颜色
  p.setColor(Color.RED);
  //绘制一个小圆(作为小球)
  canvas.drawCircle(currentX , currentY , 15 , p);  
 }
}

上面的Draw View组件继承了 View基类,并重写了 onDraw方法——该方法负责在该组 件的指定位置绘制一个小球。
有了这个自定义组件之后,接下来可以通过Java代码把该组件添加到指定容器中,这样 就可以看到该组件的运行效果。下面是该应用的Activity类。
程序清单:CustomView.java

package org.crazyit.customview;
import org.crazyit.customview.R;
import org.crazyit.customview.R.layout;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;

public class CustomView extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //获取布局文件中的LinearLayout容器
  LinearLayout root = (LinearLayout)findViewById(R.id.root);
  //创建DrawView组件
  final DrawView draw = new DrawView(this);
  //设置自定义组件的最大宽度、高度
  draw.setMinimumWidth(300); 
  draw.setMinimumHeight(500); 
  //为draw组件绑定Touch事件
  draw.setOnTouchListener(new OnTouchListener()
  {
   @Override
   public boolean onTouch(View arg0, MotionEvent event)
   {
    //修改draw组件的currentX、currentY两个属性
    draw.currentX = event.getX();
    draw.currentY = event.getY();
    //通知draw组件重绘
    draw.invalidate();
    //返回true表明处理方法已经处理该事件
    return true;
   }  
  });
  root.addView(draw);
 }
}
        

上面的程序中先创建了自定义组件(DrawView)的实例,然后程序为该组件绑定了一OnTouchListener—监听触摸屏事件的监听器。但手指在触摸屏上移动时,将会不断地触发触摸屏事件,事件监听器中负责触发事件的坐标将被传入DrawView组件,并通知该组件重绘这样即可保证DrawView上小球跟随手指移动而移动。


原文地址:http://www.itmmd.com/201412/260.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

linux命令详解(9)重定向 stdin 和 stdout使用详解   上一篇
下一篇  linux命令详解(8)查询RPM包相关信息,rpm查询命令详解

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!