转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/6828044  作者:张燕广

实现的功能:手指在屏幕上滑动,变幻颜色的小球始终跟随手指移动。

实现的思路:1)自定义View,在onDraw中画圆作为小球;2)重写自定义View的onTouchEvent方法,记录触屏坐标,用新的坐标重新绘制小球。

关键技术点:自定义View应用、触摸事件处理、canvas绘图、Paint应用

第一步:新建一个工程,命名为BallViewDemo,Activity命名为BallActivity。

第二步:编写自定义View类BallView,本例中将BallView作为BallActivity的内部类,BallActivity代码如下:

package com.zyg.customview.ball;import java.util.Random;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Bundle;import android.view.Display;import android.view.MotionEvent;import android.view.View;import android.view.Window;import android.view.WindowManager;public class BallActivity extends Activity {private int screenW;//屏幕宽度private int screenH;//屏幕高度    @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Display dis = this.getWindowManager().getDefaultDisplay();// 设置全屏requestWindowFeature(Window.FEATURE_NO_TITLE);this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 获取屏幕宽度screenW = dis.getWidth();// 获取屏幕高度screenH = dis.getHeight();setContentView(new BallView(this));}        //自定义绘图类    class BallView extends View{    private Paint paint; //定义画笔    private float cx = 50;//圆点默认X坐标    private float cy = 50;//圆点默认Y坐标    private int radius = 20;    //定义颜色数组    private int colorArray[] = {Color.BLACK,Color.BLACK,Color.GREEN,Color.YELLOW, Color.RED};    private int paintColor = colorArray[0]; //定义画笔默认颜色        public BallView(Context context) {    super(context);    //初始化画笔    initPaint();    }    private void initPaint(){    paint = new Paint();    //设置消除锯齿    paint.setAntiAlias(true);    //设置画笔颜色    paint.setColor(paintColor);    }        //重写onDraw方法实现绘图操作    @Override    protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    //将屏幕设置为白色    canvas.drawColor(Color.WHITE);    //修正圆点坐标    revise();    //随机设置画笔颜色    setPaintRandomColor();    //绘制小圆作为小球    canvas.drawCircle(cx, cy, radius, paint);    }        //为画笔设置随机颜色    private void setPaintRandomColor(){    Random rand = new Random();    int randomIndex = rand.nextInt(colorArray.length);    paint.setColor(colorArray[randomIndex]);    }        //修正圆点坐标    private void revise(){    if(cx <= radius){    cx = radius;    }else if(cx >= (screenW-radius)){    cx = screenW-radius;    }    if(cy <= radius){    cy = radius;    }else if(cy >= (screenH-radius)){    cy = screenH-radius;    }    }        @Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 按下cx = (int) event.getX();cy = (int) event.getY();// 通知重绘postInvalidate();//该方法会调用onDraw方法,重新绘图break;case MotionEvent.ACTION_MOVE:// 移动cx = (int) event.getX();cy = (int) event.getY();// 通知重绘postInvalidate();break;case MotionEvent.ACTION_UP:// 抬起cx = (int) event.getX();cy = (int) event.getY();// 通知重绘postInvalidate();break;}/* * 备注1:此处一定要将return super.onTouchEvent(event)修改为return true,原因是: * 1)父类的onTouchEvent(event)方法可能没有做任何处理,但是返回了false。 * 2)一旦返回false,在该方法中再也不会收到MotionEvent.ACTION_MOVE及MotionEvent.ACTION_UP事件。 *///return super.onTouchEvent(event);return true;  }    }}

main.xml与AndroidManifest.xml未作修改,不再贴出~

备注:代码中的备注1介绍了onTouchEvent方法在实际开发中的一个Bug的解决方法,详见代码。

第三步:运行程序,效果如下:

下一篇将用自定义SurfaceView代替自定义View实现该实例功能,并总结一下自定义View与自定义SurfaceView区别与应用场景。

更多相关文章

  1. Android读书笔记---View基础
  2. Android本地验证码的生成
  3. Android(安卓)SVG矢量图/矢量动画、Vector和VectorDrawable矢量
  4. 2014-11-8Android学习------Android(安卓)仿真翻页效果实现原理
  5. Android(安卓)OpenGL ES(二)绘制三角形
  6. 五幅图学会Android(安卓)Canvas的坐标系变换(rotate translate s
  7. Android(安卓)实现滑动方法总结
  8. Android高手进阶教程(三)之----Android(安卓)中自定义View的应用
  9. Android(安卓)自定义模拟时钟控件

随机推荐

  1. WS-Trust没有使用PHP进行身份验证
  2. 如果使用Select2 YII2选择第一个字段,请在
  3. 求助~~~php5.2.6装不上!
  4. 关于静态方法不能调用类中的非静态属性的
  5. 我无法以正确的方式放置最后一个div。而L
  6. 修改magento简报输入框大小
  7. ThinkPHP3.2学习——路由_路由定义
  8. PHP - 函数 & 检测函数/类/方法是否存在
  9. 通过PHP或jQuery刷新cart_fragments(迷你
  10. ThinkPHP中U方法与url的四种访问模式