如何在android 2.2中实现拖放?

2023-11-25

我正在尝试开发一个 Android 应用程序,用户应该能够将图像从网格的一个单元格拖动到另一个单元格。为了实现这一点,我需要 Android 3.0 中引入的拖放 API,但我的应用程序应该在 Android 2.2 中运行。那么,有没有办法使用 Touch 事件来实现这一点呢?如果是,请向我提供一些代码片段或任何简要描述它的链接。


嗨,经过很长一段时间,在 android 2.2 中成功进行拖放操作

在这里我给出了我的代码,它可以让你成功。我的主类在这里

 package info.tempDD;

    import android.app.Activity;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;

   public class TempDDActivity extends Activity implements OnTouchListener {
        /** Called when the activity is first created. */
        private View selected_item = null;
        private int offset_x = 0;
        private int offset_y = 0;
        Boolean touchFlag=false;
        boolean dropFlag=false;
        LayoutParams imageParams;
        ImageView imageDrop,image1,image2;
        int crashX,crashY;
        Drawable dropDrawable,selectDrawable;
        Rect dropRect,selectRect;
        int topy,leftX,rightX,bottomY;

        int dropArray[];    

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.main);
            ViewGroup container = (ViewGroup) findViewById(R.id.container);
            imageDrop=(ImageView) findViewById(R.id.ImgDrop);       
            image1=(ImageView) findViewById(R.id.img);      
            image2=(ImageView) findViewById(R.id.img2);
            container.setOnTouchListener(new View.OnTouchListener() 
            {
                public boolean onTouch(View v, MotionEvent event) 
                {
                    if(touchFlag==true)
                    {
                        System.err.println("Display If  Part ::->"+touchFlag);
                        switch (event.getActionMasked()) 
                        {
                        case MotionEvent.ACTION_DOWN :

                             topy=imageDrop.getTop();
                             leftX=imageDrop.getLeft();
                             rightX=imageDrop.getRight();   
                             bottomY=imageDrop.getBottom();
                            System.err.println("Display Top-->"+topy);      
                            System.err.println("Display Left-->"+leftX);
                            System.err.println("Display Right-->"+rightX);
                            System.err.println("Display Bottom-->"+bottomY);                


                            //opRect.
                            break;
                        case MotionEvent.ACTION_MOVE:
                            crashX=(int) event.getX();
                            crashY=(int) event.getY();
                            System.err.println("Display Here X Value-->"+crashX);
                            System.err.println("Display Here Y Value-->"+crashY);

                            int x = (int) event.getX() - offset_x;
                            int y = (int) event.getY() - offset_y;                                          
                            //int w = getWindowManager().getDefaultDisplay().getWidth() - 100;
                            //int h = getWindowManager().getDefaultDisplay().getHeight() - 100;
                            int w = getWindowManager().getDefaultDisplay().getWidth() - 50;
                            int h = getWindowManager().getDefaultDisplay().getHeight() - 10;
                            if (x > w)
                                x = w;
                            if (y > h)
                                y = h;                      
                            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(new ViewGroup.MarginLayoutParams(  RelativeLayout.LayoutParams.WRAP_CONTENT,   RelativeLayout.LayoutParams.WRAP_CONTENT));
                            lp.setMargins(x, y, 0, 0);                  

                            //Drop Image Here                       
                            if(crashX > leftX && crashX < rightX && crashY > topy && crashY < bottomY )                     
                            {                           
                                Drawable temp=selected_item.getBackground();                            
                                imageDrop.setBackgroundDrawable(temp);
                                imageDrop.bringToFront();                           
                                dropFlag=true;
                                selected_item.setVisibility(View.INVISIBLE);
                            }
                            //Drop Image Here                       
                            selected_item.setLayoutParams(lp);
                            break;  
                        case MotionEvent.ACTION_UP:
                            //                      
                            touchFlag=false;
                            if(dropFlag==true)
                            {
                                dropFlag=false;
                            }
                            else
                            {
                                selected_item.setLayoutParams(imageParams);
                            }                       
                            break;
                        default:
                            break;
                        }
                    }else
                    {
                        System.err.println("Display Else Part ::->"+touchFlag);
                    }               
                    return true;
                }
            });

            image1.setOnTouchListener(this);
            image2.setOnTouchListener(this);
        }

        public boolean onTouch(View v, MotionEvent event) 
        {   
            switch (event.getActionMasked()) 
            {
            case MotionEvent.ACTION_DOWN:
                touchFlag=true;
                offset_x = (int) event.getX();
                offset_y = (int) event.getY();
                selected_item = v;
                imageParams=v.getLayoutParams();
                break;
            case MotionEvent.ACTION_UP:
                selected_item=null;
                touchFlag=false;
                break;
            default:
                break;
            }       
            return false;
        }
    }

之后创建一个类并扩展您的主布局,如relativelayout

package info.tempDD;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

public class TouchInterceptor extends RelativeLayout {
    public TouchInterceptor(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        return super.onInterceptTouchEvent(ev);
    }

}

和 Main My Xml 文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/ImgDrop"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        android:layout_marginTop="50dp"
        android:background="#FFFFFF" >
    </ImageView>

    <ImageView
        android:id="@+id/img"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        android:background="@drawable/ic_launcher" >
    </ImageView>

    <ImageView
        android:id="@+id/img2"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/ic_launcher" >
    </ImageView>

</RelativeLayout>

好吧,现在我很高兴我完成了我的工作,也很高兴,因为我对我的工作感到满意,我希望这会对您有所帮助。 给我方法的链接如下。

  • rxwen-博客-东西
  • android 拖放基本
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在android 2.2中实现拖放? 的相关文章

  • 在 Android 模拟器上运行完整的 Android 手机 ROM

    正如标题所说 是否可以在 Android 模拟器中运行完整的 Android 设备 ROM 是的 你可以 但让它 100 工作可能很困难 大多数 ROM 都包含其运行硬件的特定驱动程序 我并不是 100 全力以赴 但可以尝试以下步骤 创建
  • Android Toast 消息不起作用

    我正在通过 Andengine 为 Android 开发游戏 我有 MainActivity 类和 GameScene 类 我在 GameActivity 中使用 Toast 消息 它正在发挥作用 Toast makeText this H
  • 如何使全屏覆盖在方向更改后保持全屏?

    我正在制作一个应用程序 它可以创建在屏幕上行走的微小精灵动画 我有一个主要活动 带有 启动服务 按钮 这会启动一个服务 该服务 在onCreate 创建一个全屏视图并将其附加到根窗口管理器 这部分工作完美 它充满了屏幕 您可以离开应用程序
  • 单击另一个项目/小部件时展开/打开微调器?

    当用户单击另一个按钮时 我试图展开微调器 例如 我有一个带有值的微调器和一个 确定 按钮 当用户单击 确定 按钮而不从微调器中选择任何值时 微调器会自行扩展 是否可以在无需用户与微调器交互的情况下获得扩展微调器的事件 只需致电Spinner
  • 具有自定义厚度的虚线分隔符

    我有一个虚线分隔符
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • NDK8d 未找到 std::string 操作(即 stol、stoi)

    我尝试使用 ndk r8d 和 c 11 支持来建立我的第一个 android 项目 一些 c 11 机制工作正常 即 lambda 表达式 但是当我尝试时 使用新的字符串操作之一 编译失败 错误 stol 不是 std 的成员 这是我的
  • 返回到上一个活动的最后状态

    我有两个活动 A 和 B 当应用程序启动时 活动 A 会被加载 我会从数据库将数据加载到其中 我可以毫无问题地转到活动 B 但是当我返回活动 A 时 会查看旧数据一段时间 然后重新加载活动 知道如何解决这个问题吗 在从数据库加载数据之前清除
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • webview 中的 android 移动 Twitter 页面无法打开?

    我正在尝试打开以 https 开头的 Twitter 页面webview在安卓中 但它没有打开 并且持续加载时出现黑屏 屏幕截图如下 Edit 在主网络视图中我有 Twitter 页面的链接https twitter com mytwitt
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 无法使用 Zxing Android 扫描 Code 128

    我已将 ZXing 条码阅读器集成到我的 Android 应用程序中 它可以扫描大部分代码 但我有一张电费单 它无法扫描 使用 Galaxy Ace 5 0MP 我认为问题是由于相机分辨率和焦点造成的 因为当我使用 Xperia SL 12
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • 使用bindService启动IntentService时是否应该调用onHandleIntent?

    我的服务延伸IntentService当它开始时startService onHandleIntent被叫 但是 当服务启动时bindService 我确实需要绑定 onHandleIntent没有被调用 Should onHandleIn
  • Recyclerview项目点击涟漪效果[重复]

    这个问题在这里已经有答案了 我正在尝试添加Ripple影响到RecyclerView的项目 我在网上查了一下 但找不到我需要的东西 我努力了android background归因于RecyclerView本身并将其设置为 android
  • 从 Dropbox 下载文件并将其保存到 SDCARD

    现在我真的很沮丧 我想从 Dropbox 下载一个文件并将该文件保存到 SD 卡中 我得到的代码为 private boolean downloadDropboxFile String dbPath File localFile throw

随机推荐

  • Dart 在编辑器升级后删除不允许的属性

    在 SDK 0 7 3 1 r27487 中升级我的 dart 编辑器后 我遇到错误 删除不允许的属性 我有一个自定义标签 其模板包含引导属性 data target 和 data toggle 在以前的版本下可以使用 但升级后遇到错误 C
  • Android向django服务器csrf发送post请求失败

    我希望我的 Android 应用程序能够向我的 Django 服务器发送一些信息 因此 我让 android 应用程序向 mysite upload 页面发送一个 post 请求 并且该页面的 django 视图将根据 post 数据进行工
  • loadView:iOS UIView 中的函数

    我不明白其中的机制loadView 函数 这个函数在UIView中 我创建了一个项目 如下所示 首先 我创建了一个 iPhone 的基于窗口的项目 然后 我创建了一个UIView子类 接下来 我创建了一个UIViewController子类
  • 无法在 Python 3.5 中子类化多处理队列

    我的最终目标是重定向stdout从几个子进程到一些队列 并将它们打印在某个地方 也许在一个小 GUI 中 第一步是子类化Queue变成一个行为很像的对象stdout 但这就是我陷入困境的地方 子类化多处理Queue在 Python v3 5
  • 从服务器接收结果时发生传输级错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我收到 SQL Server 错误 发生传输级错误 当收到来自 服务器 提供者 共享内存 提供者 错误 0 句柄是 无效的 我正在运行 Sql Server 2008 SP1
  • Android 2.3 模拟器方向变化

    我遇到了一些问题 我认为这与模拟器本身有关 我已将此代码放在我的顶部onCreate我的一项活动中的方法 Log d Const TAG onCreate orientation getRequestedOrientation 每次我在模拟
  • 使用 LOAD DATA INFILE 导入 MySQL 表时如何跳过 CSV 文件中的列?

    我有一个包含 11 列的 CSV 文件 还有一个包含 9 列的 MySQL 表 CSV 文件如下所示 col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 MySQL 表如下所示
  • AngularJS 指令嵌入范围= false?

    如何防止使用 transinclude 指令创建新作用域 This jsfiddle由于用红色边框说明的新 范围 我无法绑定任何内容 Html div div
  • 如何递归传递可变引用?

    我正在尝试解决这个问题在铁锈中 这是我的非编译 Rust 代码 use std collections HashMap fn main initialize HashMap let mut fibs HashMap
  • 谷歌脚本错误“您无权调用创建(第38行,文件“宏”)”

    var newSpreadsheet SpreadsheetApp create Spreadsheet to export 我正在运行 Google Sheet 脚本 并且在上面的代码行中收到以下错误消息 知道如何解决这个问题吗 我是新手
  • 作为班级成员持有背景、活动或观点是不好的表现吗?

    我在某处看到红色 将视图保留为活动的成员会降低性能 因为每个视图都保留对其父上下文的引用 并且它将填满堆 这是真的 想象一下这个活动 public class MyActivity extends FragmentActivity priv
  • EPPlus,查找并设置命名范围的值

    我一直在努力尝试使用 ExcelPackage 3 0 1 库设置命名范围 在本例中为单个命名单元格 的值 它应该像这样简单 ExcelNamedRange er xlPackage Workbook Names Customer er V
  • 如何在字典中按原始顺序返回键

    我正在读取一个文件并将信息存储在一个字典中 因为它从上到下读取 与原始文件相比 我不想以错误的顺序打印 另外 一个非常小的问题 我记得在某处看到过 if 和 else 语句的简短形式 if a a a b a c 你知道具体的形式吗 Tha
  • Rails 计算日期范围(以月为单位)

    如何计算两个日期相差几个月 另外 如果它有所不同 我正在使用 Date 对象 而不是 DateTime 另外 一些舍入选项可能会很好 这样我就可以控制是否要对部分月份进行向上或向下舍入 Thanks 从一个日期或日期时间中减去另一个日期或日
  • windows %PATH% 变量 - 如何在“;”上分割再次在 CMD shell 中[重复]

    这个问题在这里已经有答案了 我刚刚检查过堆栈溢出这似乎非常有帮助 并且在 Windows XP 上运行良好 但使用 Windows 7 时 由于某些不明原因 它无法正常工作 The PATH变量看起来像这样 C Program Files
  • 单击按钮时更改选项菜单的选项

    假设我有一个选项菜单network select它有一个要连接的网络列表 import Tkinter as tk choices network one network two network three var tk StringVar
  • python-click:依赖于另一个选项的选项

    这个问题是关于click包 我想设置我的命令 以便一些optional options取决于特定选项值 并且根据其值需要 所需选项 输入 输入文件 doe 整数 代表算法名称 子选项 如果母鹿是 等于1 then option genera
  • 使用QT,如何在一定时间间隔后调用一次函数,即使可能会发生更多调用?

    尽管我认为这个问题没有那么复杂 但我很难用措辞来表达这个问题 我想做类似的事情QTimer singleshot 但我希望它仍然只调用 SLOT 一次 即使QTimer singleshot 在触发之前被多次调用 如果您只想在计时器关闭后调
  • 实施汉恩窗

    我获取传入数据块并将它们通过 fftw 传递以获取一些光谱信息 一切似乎都正常 但我认为我遇到了一些别名问题 我一直在尝试找出如何在我的数据块上实现汉恩窗口 谷歌的例子让我失望了 我应该查看任何想法或链接吗 double dataIn 20
  • 如何在android 2.2中实现拖放?

    我正在尝试开发一个 Android 应用程序 用户应该能够将图像从网格的一个单元格拖动到另一个单元格 为了实现这一点 我需要 Android 3 0 中引入的拖放 API 但我的应用程序应该在 Android 2 2 中运行 那么 有没有办