android触屏拖动图片

来源:互联网 发布:oracle删除字段数据 编辑:程序博客网 时间:2024/06/10 19:11

本博文介绍一下手指触屏滑动拖动图片移动的功能实现.

在Android系统中,可以通过Bitmap提供的getHeight和getWidth方法来获取某幅图片的高度和宽度,在本实例中,使用这些方法结合触屏事件分发机制实现了上下、左右移动图片的功能。


先看布局,很简单,只需要一个展示图片的ImageView

<?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"
  >
  <ImageView
    android:id="@+id/myImageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
  </ImageView>
</AbsoluteLayout>


再看业务代码逻辑实现

package ly.project;

import ly.project.R;
import android.app.Activity;
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 TouchImageActivity extends Activity
{
  /*声明ImageView变量*/
  private ImageView mImageView01;
  /*声明相关变量作为存储图片宽高,位置使用*/
  private int intWidth, intHeight, intDefaultX, intDefaultY;
  private float mX, mY;
  /*声明存储屏幕的分辨率变量 */
  private int intScreenX, intScreenY;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    /* 取得屏幕对象 */
    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.qq);
    
    /* 初始化按钮位置居中 */
    RestoreButton();
    
    /* 当点击ImageView,还原初始位置 */
    mImageView01.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        RestoreButton();
      }
    });
  }
 
  /*覆盖触控事件*/
  @Override
  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(TouchImageActivity.this, str, Toast.LENGTH_LONG).show();
    }
    else
    {
      Toast.makeText(TouchImageActivity.this, str, Toast.LENGTH_SHORT).show();
    }
  }
}


0 0
原创粉丝点击