图片移动并进行边界判断

package com.twy.test; 

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; 

public class TestDemo 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 - 50; 

        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: 

                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; 

                // 设置不能出界 

                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; 

        } 

    }; 

 xml 代码

Java代码 

<?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"> 

    <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> 

其中 在onTouch 代码中 如果返回 false 就不能捕捉到ACTION_MOVE 事件。

 对于onTouchEvent 中onTouch返回值

1 、如果return false 说明还没有消费onTouch事件,在执行onTouch里代码后,onTouch事件并没有结束。

2、如果return true 说明消费了onTouch事件 onTouch事件结束了

但在实际操作中 除了ACTION_DOWN事件以外,其余的事件只有返回true的那个方法才能捕捉到。所以 返回false的时候只能捕捉到每次的第一个DOWN事件 后面的MOVE 和UP事件就捕捉不到了。

DisplayMetics 类:

Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

为了获取DisplayMetrics 成员,首先初始化一个对象如下:

Java代码 

DisplayMetrics metrics = new DisplayMetrics();  

getWindowManager().getDefaultDisplay().getMetrics;  

//getWindowManager() 获取显示定制窗口的管理器 

//getDefaultDisplay() 获取默认显示Display对象 

//getMetrics(dm) 通过Display对象的数据来初始化一个DisplayMetrics对象 

 v.layout(left, top, right, bottom);

Assign a size and position to a view and all of its descendants

This is the second phase of the layout mechanism. (The first is measuring). In this phase, each parent calls layout on all of its children to position them. This is typically done using the child measurements that were stored in the measure pass(). Derived classes with children should override onLayout. In that method, they should call layout on each of their their children.

Parameters:

l Left position, relative to parent

t Top position, relative to parent

r Right position, relative to parent

b Bottom position, relative to parent

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

看机器学习如何还原图像色彩

【译者注】在本文中,作者提出了使用k-means算法来对图像进行色彩还原,介绍算法的步骤,同时应用在图像上,通过对比还原前后的图像,来证明k-means算法的有...

23670
来自专栏高爽的专栏

Java Mail(二):JavaMail介绍及发送一封简单邮件

JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMA...

38870
来自专栏云计算

使用JClouds在Java中获取和发布云服务器

本文中,我们举例来说明如何使用JClouds API 获取和发布云服务器。JClouds API 可以和大量云服务提供商(包括Amazon EC2和Racksp...

22690
来自专栏企鹅号快讯

如何搭建Nginx服务器做到负载均衡?

小白,这是一篇关于:使用tomcat和Nginx进行配合做负载均衡和静态与动态资源分配的文章,春招前学一下~ 好的,大佬! 1.什么是Nginx? Nginx也...

35950
来自专栏JackieZheng

如何写出好代码

如何写出好代码 这个题目把我自己都看傻了,因为仔细想想,这不是一个命题,是对代码的思考,对细节的推敲和打磨。写好代码是一门学问,还是一种修行。 以前是公众号(...

24750
来自专栏高爽的专栏

Java Mail(三):Session、Message详解

上篇文章介绍了JavaMail并实现了一个发送邮件的简单示例,JavaMail API使用上非常灵活,比如,服务器信息可以设置到Session中,也可以设...

27480
来自专栏JackieZheng

Hadoop阅读笔记(七)——代理模式

  关于Hadoop已经小记了六篇,《Hadoop实战》也已经翻完7章。仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序、单表链接等,想得其精髓,...

244100
来自专栏编程

6本PHP必备书籍,你值得拥有

PHP(Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,...

27060
来自专栏编程

编程小技巧:多态原理

今天要跟大家分享的小技巧是关于多态的。多态是面向对象的程序设计最重要的一个特性。多态使得程序变得更加灵活更加抽象。那么多态究竟是什么呢?它在计算机内部到底是如何...

22050
来自专栏编程

RxJava系列一

前言 提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了Rx...

267100

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励