Android 拖动图片

怎样才能在手机屏幕中拖动一个View,比如拖动图片ImageView?
准备知识点:
1、要使用到的View类的知识点:
View的宽:  View: getWidth()
View的高: View: getHight()
View左边距离屏幕左边的距离: View: getLeft();
View上边距离屏幕上边的距离: View: getTop();
View右边距离屏幕左边的距离: View: getRight();
View下边距离屏幕上边的距离: View: getBottom();
重新设置View的以上属性,可以修改View的位置,和View的大小。(在LinearLayout中也可以成功)
View: layout(int left, int top, int right, int bottom);

示例:
(1)java代码:
package com.fs.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
 private TextView textView;
 private void init() {
  this.textView = (TextView) this.findViewById(R.id.textView);
 }
 @Override
 public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         this.init();
         this.textView.setOnClickListener(this);
     }
 
 @Override
 public void onClick(View v) {
  if(v == this.textView) {
   //得到textView左边到屏幕左边的的距离
   int left = this.textView.getLeft();
   //得到textView上边到屏幕上边的的距离
   int top = this.textView.getTop();
   //得到textView右边到屏幕左边的的距离
   int right = this.textView.getRight();
   //得到textView下边到屏幕上边的的距离
   int bottom = this.textView.getBottom();
   System.out.println(left);
   System.out.println(top);
   System.out.println(right);
   System.out.println(bottom);
   //重新设置textView的位置
   v.layout(left+10, top+10, right+10, bottom+10);
  }
 }
}
(2)main.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
 android:id="@+id/textView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="你敢点我,我就变位置!"
    />
</LinearLayout>
2、屏幕属性获取
使用DisplayMetrics类的对象可以获取手机屏幕的属性(屏幕像素、屏幕大小....);
DisplayMetrics类对象的获取,可以使用Activity从Context类中继承下来的函数getResource().getDisplayMetrics();得到
例如DisplayMetrics dm = getResources().getDisplayMetrics();
这后就可以通过dm相应的getXXX()函数可以得到屏幕属性
3、View类对象的OnTouchListener监听器:
该监听事件的回调函数为
public boolean onTouch(View v, MotionEvent event)
其中v是事件源,event是事件,通过event对象可以得到所有的事件信息
event的getAction()函数的返回值可以判断触摸屏幕的动作,
比如
返回值等于MotionEvent.ACTION_DOWN说明触摸了v
返回值等于MotionEvent.ACTION_MOVE说明在手指在v上滑动
返回值等于MotionEvent.ACTION_UP说明触摸后松开了
event的getRawX(),与getRawY()函数可以得到正在触摸的手指的坐标(以屏幕左上角为坐标原点)

4、有了以上知识点之后,那么就可以用手拖动View
下面来完成最开始提出的问题:
下面做一个用手按住图片就可以拖动图片,改变图片的确位置
(1)
布局文件main.xml的内容
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <RelativeLayout android:id="@+id/relativeLayout1"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <ImageView android:id="@+id/imageView1"
            android:layout_width="wrap_content" android:background="@drawable/icon"
            android:layout_height="wrap_content" android:layout_alignParentLeft="true"></ImageView>
        <ImageView android:id="@+id/imageView2"
            android:layout_width="wrap_content" android:background="@drawable/icon"
            android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageView1"
            android:layout_alignTop="@+id/imageView1"                  android

:layout_alignBottom="@+id/imageView1"></ImageView>
    </RelativeLayout>
 
</LinearLayout>
(2)java代码
package com.fs.activity;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
    private ImageView img1;
    private ImageView img2;
    private int screenWidth;
    private int screenHeight;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        img1 = (ImageView) findViewById(R.id.imageView1);
        img2 = (ImageView) findViewById(R.id.imageView2);
 
        DisplayMetrics dm = getResources().getDisplayMetrics();
        screenWidth = dm.widthPixels;
        screenHeight = dm.heightPixels - 150;
 
        img1.setOnTouchListener(movingEventListener);
        img2.setOnTouchListener(movingEventListener);
    }
 
    private OnTouchListener movingEventListener = new OnTouchListener() {
        int lastX, lastY;
 
        @Override
        public boolean onTouch(View v, MotionEvent event) {
         switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
             Toast.makeText(MainActivity.this, "Down...", Toast.LENGTH_SHORT).show();
             lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int dx = (int) event.getRawX() - lastX;
                int dy = (int) event.getRawY() - lastY;

                int left = v.getLeft() + dx;
                int top = v.getTop() + dy;
                int right = v.getRight() + dx;
                int bottom = v.getBottom() + dy;
               
                System.out.println("left:"+left);
                System.out.println("top:"+top);
                System.out.println("right:"+right);
                System.out.println("bottom:"+bottom);
               
                // 设置不能出界
                if (left < 0) {
                    left = 0;
                    right = left + v.getWidth();
                }
 
                if (right > screenWidth) {
                    right = screenWidth;
                    left = right - v.getWidth();
                }
 
                if (top < 0) {
                    top = 0;
                    bottom = top + v.getHeight();
                }
 
                if (bottom > screenHeight) {
                    bottom = screenHeight;
                    top = bottom - v.getHeight();
                }
                v.layout(left, top, right, bottom);
 
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
 
                break;
            case MotionEvent.ACTION_UP:
                break;
            }
            return true;
        }
    };
}
(3)完了

 

 

 

 

 

 

 


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值