Android应用小实例--跟随手指的小球

本文展示了如何在Android应用中自定义视图组件,实现一个跟随手指移动的小球动画效果。通过继承View基类并重写onDraw方法绘制小球,同时在onTouchEvent方法中响应触摸事件,更新小球的位置并触发重新绘制,从而达到动态显示的效果。

实现效果图:

\

 

实现方式:

继承View类自己重绘一个圆,然后将这个自定义的继承于View类的加入到当前的Activity并且为这个自定义的View控件添加一个onTouchLitener事件

 

自定义组件继承于View类:

 

package com.jiahui.draw; 

 

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; 

     

    //必须重写一个构造方法 

    public DrawView(Context context) { 

        super(context); 

        // TODO Auto-generated constructor stub 

    } 

    //重写onDraw方法通过Canvas绘画 

    @Override 

    protected void onDraw(Canvas canvas) {       

        super.onDraw(canvas); 

        //创建画笔 

        Paint paint=new Paint(); 

        paint.setColor(Color.RED); 

        //绘制一个小圆 

        canvas.drawCircle(currentX, currentY, 25, paint); 

 

    } 

     

 

 

将自定义的组件添加到当前的Activity

 

package com.jiahui.draw; 

 

import android.app.Activity; 

import android.os.Bundle; 

import android.view.MotionEvent; 

import android.view.View; 

import android.widget.LinearLayout; 

 

public class CustomeViewActivity extends Activity { 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

         

        LinearLayout root=(LinearLayout) findViewById(R.id.root); 

         

        //创建一个自己继承于View的对象 

        final DrawView drawView=new DrawView(this); 

        //设置自定义组件的最大宽度和高度 

        drawView.setMinimumWidth(300); 

        drawView.setMinimumHeight(500); 

   

        drawView.setOnTouchListener(new View.OnTouchListener() {     

            public boolean onTouch(View v, MotionEvent event) { 

                drawView.currentX=event.getX(); 

                drawView.currentY=event.getY();  

                //重绘 

                drawView.invalidate(); 

                //返回true表明算是方法已经处理该事件 

                return true; 

            } 

        }); 

        root.addView(drawView); 

    } 

 

main.xml:

 

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

    android:layout_width="fill_parent" 

    android:layout_height="fill_parent" 

    android:orientation="vertical"  

    android:background="#99FFCC" 

    android:id="@+id/root"> 

</LinearLayout 这个案例主要展示如何开发自定义的View。View组件的作用类似于Swing编程中的JPanel,它也是一个矩形的空白区域,View组件没有任何内容。对于Android应用的其他UI组件来说,他们都继承了View组件,然后在View组件提供的空白区域上绘制外观。
       程序员在开发自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类里面的方法。但是程序员并不需要重写所有方法,只需重写部分。下面以一个简单而清晰的案例来说明:
      为了实现一个能跟随手指的小球,我们需要自定义UI组件,首先绘制一个小球,位置能动态改变,当用户通过手指在屏幕上拖动,程序在监听到这个动作的时候,获取位置坐标,传给自定义的组件,并重绘一个小球。
具体代码:
DrawView.java--------继承了View基类,并重写了onDraw方法,该方法负责在制定位置画一个小球。

  1. package org.crazyit.customview;

  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.view.View;

  7. public class DrawView extends View
  8. {
  9.         public float currentX = 40;
  10.         public float currentY = 50;
  11.         /**
  12.          * @param context
  13.          */
  14.         public DrawView(Context context)
  15.         {
  16.                 super(context);
  17.                 // TODO Auto-generated constructor stub
  18.         }
  19.         @Override
  20.         public void onDraw (Canvas canvas)
  21.         {
  22.                 super.onDraw(canvas);
  23.                 //创建画笔
  24.                 Paint p = new Paint();
  25.                 //设置画笔的颜色
  26.                 p.setColor(Color.RED);
  27.                 //绘制一个小圆(作为小球)
  28.                 canvas.drawCircle(currentX , currentY , 15 , p);                
  29.         }
  30. }
复制代码
CustomView.java--------
  1. package org.crazyit.customview;

  2. import org.crazyit.customview.R;
  3. import org.crazyit.customview.R.layout;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.View.OnTouchListener;
  9. import android.widget.LinearLayout;

  10. public class CustomView extends Activity
  11. {
  12.         @Override
  13.         public void onCreate(Bundle savedInstanceState)
  14.         {
  15.                 super.onCreate(savedInstanceState);
  16.                 setContentView(R.layout.main);
  17.                 //获取布局文件中的LinearLayout容器
  18.                 LinearLayout root = (LinearLayout)findViewById(R.id.root);
  19.                 //创建DrawView组件
  20.                 final DrawView draw = new DrawView(this);
  21.                 //设置自定义组件的最大宽度、高度
  22.                 draw.setMinimumWidth(300); 
  23.                 draw.setMinimumHeight(500); 
  24.                 //为draw组件绑定Touch事件
  25.                 draw.setOnTouchListener(new OnTouchListener()
  26.                 {
  27.                         @Override
  28.                         public boolean onTouch(View arg0, MotionEvent event)
  29.                         {
  30.                                 //修改draw组件的currentX、currentY两个属性
  31.                                 draw.currentX = event.getX();
  32.                                 draw.currentY = event.getY();
  33.                                 //通知draw组件重绘
  34.                                 draw.invalidate();
  35.                                 //返回true表明处理方法已经处理该事件
  36.                                 return true;
  37.                         }                
  38.                 });
  39.                 root.addView(draw);
  40.         }
  41. }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值