`
RyanHoo
  • 浏览: 2045 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DragTheBall小游戏之Android拖拽技术

阅读更多

导读:初学乍练,欢迎多多指教。


     本例是一个拖动小球的游戏(坑爹,给Baby玩的吧。。),主要是用到Android2D绘图技术、自定义组件技术。

 话不多说,先上图   

1. 窗口在拖动小球之后会变为当前的Touch坐标

2. 当手选中小球(有点难选中,球有点儿小),手机会震动(必须是真机才有震动),50ms。


3. 小球会随着手的移动而移动。

4. 不加代码控制的话,小球可以自Right、Bottom两个方向移出视图,那个时候你就看不到了。不过本例子中加入了代码,是不能移出边界的。

5.  例子比较简单,功能也很单一,需要改进。欢迎安油门提出更好的实现方案。

实现思路:

    1.  自定义一个BallView类,主要有一个成员变量HashSet<Ball> basket,顾名思义,用来存放Ball的Set集合。

    2. BallView实现OnTouchListener,能监听Touch事件。

    3. 将实现好的BallView类加入MainActivity,运行即可见到如图效果。

代码:

package ryan.entity;

import android.util.Log;

/**
 * @author Ryan Hoo
 * @date: 2012/3/11
 * */
public class Ball {
	public int id;// 唯一标示
	public float x;// 横坐标
	public float y;// 纵坐标

	public int drawableId;

	public Ball(float x, float y, int drawableId) {
		this.x = x;
		this.y = y;
		this.drawableId = drawableId;
		id = this.hashCode();
		Log.d("ball init", "id:" + id + " x:" + x + " y:" + y + " drawableId:"
				+ drawableId);
	}
}

 package ryan.view;

import java.util.HashSet;
import java.util.Iterator;

import ryan.activity.R;
import ryan.entity.Ball;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Vibrator;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class BallView extends View implements OnTouchListener {
	// 一个HashSet(无法重复元素),存放要用来添加的小球
	private HashSet<Ball> basket;
	// 上下文对象,即将要使用此视图的对象
	private Context context;
	private float mX;
	private float mY;
	private Ball drag;

	public BallView(Context context) {
		super(context);
		this.context = context;
		basket = new HashSet<Ball>();
		setOnTouchListener(this);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 绘制logo
		canvas.drawBitmap(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.title), 0, 0, null);
		for (Iterator<Ball> it = basket.iterator(); it.hasNext();) {
			Ball ball = it.next();
			// 解码成Bitmap
			Bitmap bitmap = BitmapFactory.decodeResource(
					context.getResources(), ball.drawableId);
			// 图片50*50
			
			canvas.drawBitmap(bitmap, ball.x, ball.y, null);

		}

	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		mX = event.getX();
		mY = event.getY();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			// 若为按下鼠标,判断拖拽点在哪个球的上面
			getDragBall(mX, mY);
			break;
		case MotionEvent.ACTION_MOVE:
			// 如果超出了界限的话,不进行下面的操作

			if (mX >= (getWidth() - 50) || mY >= (getHeight() - 50)) {
				break;
			}
			// 设置被拖动球的位置
			if (drag != null) {
				drag.x = mX;
				drag.y = mY;
			}
			// 重绘
			break;
		case MotionEvent.ACTION_UP:
			// 不在按下状态时,清空drag对象
			drag = null;
			break;

		}
		invalidate();
		((Activity) context).setTitle("DragTheBall:x:"
				+ (float) (Math.round(mX * 100)) / 100 + " y:"
				+ (float) (Math.round(mY * 100)) / 100);
		return true;
	}

	public boolean addComponent(Ball ball) {
		// true when this HashSet did not already contain the object, false
		// otherwise
		return basket.add(ball);
	}

	public void getDragBall(float x, float y) {
		for (Iterator<Ball> it = basket.iterator(); it.hasNext();) {

			Ball ball = it.next();
			// 如果拖拽点在球的区域内,返回该球
			if (x > ball.x && y > ball.y && x < (ball.x + 50)
					&& y < (ball.y + 50)) {
				this.drag = ball;
				// 震动提示用户已经触摸到球
				try {
					Vibrator vibrator = (Vibrator) context
							.getApplicationContext().getSystemService(
									Service.VIBRATOR_SERVICE);

					//vibrator.vibrate(new long[] { 100, 10, 100, 1000 }, -1);
					vibrator.vibrate(50);
				} catch (Exception e) {
					System.err.println(e);
				}
			}
		}
	}
}
 package ryan.activity;
import ryan.entity.Ball;
import ryan.view.BallView;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;
import android.widget.Toast;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		/*requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);*/
		BallView view = new BallView(this);
		view.setBackgroundDrawable(getResources().getDrawable(R.drawable.back));
		view.addComponent(new Ball(0, 10, R.drawable.ball_blue));
		view.addComponent(new Ball(80, 10, R.drawable.bol_geel));
		view.addComponent(new Ball(160, 10, R.drawable.bol_groen));
		view.addComponent(new Ball(240, 10, R.drawable.bol_rood));
		super.onCreate(savedInstanceState);
		setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.FILL_PARENT));

		int width = getWindowManager().getDefaultDisplay().getWidth();
		int height = getWindowManager().getDefaultDisplay().getHeight();
		Toast.makeText(this, "width:" + width + "\nheight:" + height,
				Toast.LENGTH_SHORT).show();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.menu, menu);
		return true;
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		if(item.getItemId() == R.id.exit)
			finish();
		return super.onMenuItemSelected(featureId, item);
	}
}
 源码下载地址

 

http://download.csdn.net/detail/floodingfire/4131227

0
0
分享到:
评论
1 楼 dingbuoyi 2012-08-28  
垃圾游戏。。。

相关推荐

    android小游戏源码

    《安卓连连看小游戏源码解析》 在移动设备领域,Android平台因其开源和广泛的设备支持,成为了游戏开发者的重要选择。...通过对源码的学习,开发者可以深入理解Android游戏开发的核心技术,并为自己的项目积累经验。

    6个android原生开发小游戏

    以下6个游戏项目提供了丰富的学习资源,涵盖了从基础到进阶的Android游戏开发技术: 1. **Android 美女拼图游戏**:这是一个典型的图像处理和逻辑编程的游戏。开发者可能使用了Android的Bitmap类来处理图片,通过...

    android拼图小游戏源代码

    【Android拼图小游戏源代码详解】 对于初学者来说,学习Android开发是一个有趣且充满挑战的过程。这个"android拼图小游戏源代码"是一个很好的起点,它可以帮助你了解Android Studio的使用,掌握基本的Android编程...

    Android 拖拽控件交换位置

    在Android开发中,拖拽控件并实现它们的位置交换是一项常见的需求,特别是在设计交互式界面时。本篇文章将深入探讨如何在Android应用中实现在布局中拖拽控件并完成位置互换的功能。 首先,我们需要了解Android中的...

    android拼图小游戏

    【Android拼图小游戏详解】 Android拼图小游戏是一种常见的休闲娱乐应用程序,它主要基于Android平台开发,旨在提供一种轻松、有趣的拼图体验。这种游戏通常包括将一张完整的图像分割成若干块,然后玩家需要通过...

    Android拖动,缩放,自定义内容控件源码

    本文将深入探讨如何基于Android系统,创建一个可拖动、可缩放且能填充自定义内容的控件,类似于一个可操作的RelativeLayout。我们将从以下几个关键知识点出发进行讲解: 1. **触摸事件处理**: Android中的触摸...

    android 拖拽 gridview拖动+自动移位效果 zaker

    在Android开发中,实现“拖拽GridView拖动+自动移位效果”是一项有趣且实用的技术。这个功能在很多应用中都能看到,比如Zaker这样的新闻阅读应用,用户可以通过手势自由调整内容布局,提升用户体验。接下来,我们将...

    android控件在界面上自由拖动位置显示

    在Android开发中,实现控件在界面上自由拖动位置显示是一种常见的需求,可以提供更加灵活和用户友好的交互体验。本主题主要涉及的是如何在Android应用中创建一个自定义的拖动控件,允许用户自由调整控件在屏幕上的...

    Android拖拽交换控件

    在Android开发中,拖拽交互是一种常见的用户界面设计,它能提供直观且便捷的操作体验。本文将详细讲解如何实现一个简单的拖拽交换控件的功能,类似于Android手机应用快捷方式的拖拽交换效果。 首先,我们需要了解...

    android文件拖拽实现

    在Android平台上,实现文件拖拽功能可以极大地提升用户体验,特别是在文件管理器应用中。这个功能让用户能够通过直观的拖放操作来移动或复制文件,提高了操作的便捷性。以下是对"android文件拖拽实现"这一主题的详细...

    android拖动控件,解决回到原点

    在Android开发中,实现可拖动的控件是一项常见的需求,比如在创建自定义交互界面时。"android拖动控件,解决回到原点"这个标题揭示了一个常见问题:当用户拖动一个视图(View)后,由于父布局的刷新或其他原因,如...

    android拖动小球demo

    在Android开发中,"android拖动小球demo"是一个典型的触摸事件处理与图形绘制的实践案例。这个程序展示了如何通过监听用户的触摸事件,使小球在屏幕上跟随手指移动。下面我们将详细探讨涉及的知识点。 1. **Android...

    Android 可拖拽移动的RecyclerView

    总之,通过结合RecyclerView、ItemTouchHelper和自定义Adapter,我们可以轻松实现Android应用中的可拖拽移动列表。这个功能增强了用户的交互体验,使得数据排序变得更加直观和便捷。在实际开发中,根据项目需求,你...

    android 拖拽控件资源下载

    下面将详细解释Android中拖拽控件的基本原理、关键步骤以及可能涉及的技术点。 一、Android手势识别 Android系统提供了一个强大的手势识别框架,主要通过`GestureDetector`和`MotionEvent`来实现。`GestureDetector...

    android中的拖拽技术

    在Android开发中,拖拽(Drag and Drop)技术是一项常用的功能,它允许用户通过手势将一个视图元素从一处移动到另一处,极大地提升了用户体验。本文将深入探讨Android中的拖拽技术,包括其实现原理、步骤以及一些...

    android listview 拖拽效果

    "android listview 拖拽效果"是指在ListView上实现的一项高级功能,允许用户通过手势拖动ListView中的每个条目(item)来改变它们的位置,提供了一种直观且交互性强的用户体验。在本篇文章中,我们将深入探讨如何...

    android tablayout重新排序以及拖动选择标签

    总结起来,实现Android TabLayout的标签拖动选择和重新排序功能涉及触摸事件监听、动画效果、数据源排序和TabLayout更新等多个环节。通过以上步骤,你可以创建出一个用户友好且交互性强的导航栏,提升应用的用户体验...

    android 拖拽图片 拖动浮动按钮到处跑

    在Android开发中,拖拽功能是一项常见的交互设计,可以增强用户体验。本文将详细介绍如何实现“拖拽图片”和“拖动浮动按钮到处跑”的功能。 首先,我们需要在`onCreate`方法中初始化屏幕尺寸,以便在拖动过程中...

    android拖拽效果仿zaker 优化性能版本

    在Android开发中,实现类似Zaker...以上就是实现“android拖拽效果仿zaker 优化性能版本”所涉及的主要技术点和策略。通过这些方法,开发者可以创建出与Zaker类似的高质量拖动体验,提升用户在Android应用中的满意度。

    Android类似桌面应用拖动的GridView

    "Android类似桌面应用拖动的GridView"是指一个特殊定制的GridView,它模仿了Android桌面应用的交互方式,允许用户通过拖放操作来改变GridView中各个元素的位置。这种功能在创建自定义启动器、文件管理器或个性化布局...

Global site tag (gtag.js) - Google Analytics