Android在屏幕任意点移动图片【大明进化二十四】

本文介绍了一个利用onTouchEvent方法实现的简单游戏功能,即点击屏幕不同区域,图片会相应移动到屏幕的不同角落。该效果适用于游戏开发,通过代码实现屏幕滑动与图片动态响应之间的交互。分享源码并提供程序开始界面示例,欢迎读者讨论和学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                 今天看书,看到了这个效果,以前也用过onTouchEvent(MotionEvent event)这个方法,但是没有想到这么用,感觉不错,所以就自己写了一下,感觉效果不错,以后如果做游戏用得到,点击屏幕在屏幕上滑动,图片跟着滑动!效果不错啊!哈哈,分享一下给大家,希望给大家点启迪,有问题的留言,想要源码的留言,欢迎大家留言讨论!转载请标明出处:

http://blog.youkuaiyun.com/wdaming1986/article/details/6788097

          

                                                 程序开始界面:                                              点击屏幕左上角,图片移动过去

                                                         

 

                                 点击屏幕左下角,图片移动过去                            点击屏幕右下角,图片移动过去

                                                         

代码说明一切:

在TouchDemo工程下,com.cn.daming的包下面:

一、MainActivity.java类的代码:     

package com.cn.daming;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
	/*声明ImageView变量*/
	  private ImageView mImageView01;
	  /*声明相关变量作为存储图片宽高,位置使用*/
	  private int intWidth, intHeight, intDefaultX, intDefaultY;
	  private float mX, mY; 
	  /*声明存储屏幕的分辨率变量 */
	  private int intScreenX, intScreenY;

	  public void onCreate(Bundle savedInstanceState)
	  {
	    super.onCreate(savedInstanceState); 
	    setContentView(R.layout.main);
	    
	    drawBackground();
	    
	    /* 取得屏幕对象 */
	    DisplayMetrics dm = new DisplayMetrics(); 
	    getWindowManager().getDefaultDisplay().getMetrics(dm);
	    
	    /* 取得屏幕解析像素 */
	    intScreenX = dm.widthPixels;
	    intScreenY = dm.heightPixels;
	    
	    /* 设置图片的宽高 */
	    intWidth = 100;
	    intHeight = 100;
	    /*通过findViewById构造器创建ImageView对象*/ 
	    mImageView01 =(ImageView) findViewById(R.id.myImageView1);
	    /*将图片从Drawable赋值给ImageView来呈现*/
	    mImageView01.setImageResource(R.drawable.body);
	    
	    /* 初始化按钮位置居中 */
	    RestoreButton();
	    
	    /* 当点击ImageView,还原初始位置 */
	    mImageView01.setOnClickListener(new Button.OnClickListener()
	    {
	      public void onClick(View v)
	      {
	        RestoreButton();
	      }
	    });
	  }
	  
	  //加载背景颜色
	  public void drawBackground()    
	           {    
	               GradientDrawable grad = new GradientDrawable(     
	                          Orientation.TL_BR,    
	                          new int[] {  
	                                         Color.rgb(0, 0, 127),    
	                                         Color.rgb(0, 0, 255),    
	                                         Color.rgb(127, 0, 255),    
	                                         Color.rgb(127, 127, 255),    
	                                         Color.rgb(127, 255, 255),    
	                                         Color.rgb(255, 255, 255)  
	                                     }     
	               );     
	               this.getWindow().setBackgroundDrawable(grad);    
	           }    

	  
	  /*覆盖触控事件*/
	  public boolean onTouchEvent(MotionEvent event) 
	  {
	    /*取得手指触控屏幕的位置*/
	    float x = event.getX();
	    float y = event.getY();
	    
	    try
	    {
	      /*触控事件的处理*/
	      switch (event.getAction()) 
	      {
	        /*点击屏幕*/
	        case MotionEvent.ACTION_DOWN:
	          picMove(x, y);
	            break;
	        /*移动位置*/
	        case MotionEvent.ACTION_MOVE:
	          picMove(x, y);
	            break;
	        /*离开屏幕*/
	        case MotionEvent.ACTION_UP:
	          picMove(x, y);  
	            break;
	      }
	    }catch(Exception e)
	      {
	        e.printStackTrace();
	      }
	    return true;
	  }
	  /*移动图片的方法*/
	  private void picMove(float x, float y)
	  {
	    /*默认微调图片与指针的相对位置*/
	    mX=x-(intWidth/2);
	    mY=y-(intHeight/2);
	    
	    /*防图片超过屏幕的相关处理*/
	    /*防止屏幕向右超过屏幕*/
	    if((mX+intWidth)>intScreenX)
	    {
	      mX = intScreenX-intWidth;
	    }
	    /*防止屏幕向左超过屏幕*/
	    else if(mX<0)
	    {
	      mX = 0;
	    }
	    /*防止屏幕向下超过屏幕*/
	    else if ((mY+intHeight)>intScreenY)
	    {
	      mY=intScreenY-intHeight;
	    }
	    /*防止屏幕向上超过屏幕*/
	    else if (mY<0)
	    {
	      mY = 0;
	    }
	    /*通过log 来查看图片位置*/
	    Log.i("jay", Float.toString(mX)+","+Float.toString(mY));
	    /* 以setLayoutParams方法,重新安排Layout上的位置 */
	    mImageView01.setLayoutParams
	    (
	      new AbsoluteLayout.LayoutParams
	      (intWidth,intHeight,(int) mX,(int)mY)
	    );
	  }
	  
	  /* 还原ImageView位置的事件处理 */
	  public void RestoreButton()
	  {
	    intDefaultX = ((intScreenX-intWidth)/2);
	    intDefaultY = ((intScreenY-intHeight)/2);
	    /*Toast还原位置坐标*/
	    mMakeTextToast
	    (
	      "("+
	      Integer.toString(intDefaultX)+
	      ","+
	      Integer.toString(intDefaultY)+")",true
	    );
	    
	    /* 以setLayoutParams方法,重新安排Layout上的位置 */
	    mImageView01.setLayoutParams
	    (
	      new AbsoluteLayout.LayoutParams
	      (intWidth,intHeight,intDefaultX,intDefaultY)
	    );
	  }
	  
	  /*自定义一发出信息的方法*/
	  public void mMakeTextToast(String str, boolean isLong)
	  {
	    if(isLong==true)
	    {
	      Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
	    }
	    else
	    {
	      Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
	    }
	  }
}

 

二、在main.xml布局文件中的代码:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
  android:id="@+id/widget27"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  >
  <TextView
    android:id="@+id/myTextView"    
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_x="80dip"
    android:text="@string/hello"
    />
  <ImageView
    android:id="@+id/myImageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
  </ImageView>
</AbsoluteLayout>


 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值