前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图片移动并进行边界判断

图片移动并进行边界判断

作者头像
xiangzhihong
发布2018-01-29 10:10:45
1.4K0
发布2018-01-29 10:10:45
举报
文章被收录于专栏:向治洪向治洪

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-12-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档