我正在尝试扩展FrameLayout以便能够确定要为哪个视图传递触摸事件:

myApp是这样的: 在此处输入图片说明

点在水平滚动视图中,矩形只是一个视图。 当您触摸点区域时,它就会滚动。 我希望矩形是可拖动的。 我一次可以做一次(我的意思是-如果框架只有一个孩子)。 但不是两者兼而有之。 我认为我需要重写:onInterceptTouchEvent,但没有设法将事件传递给Rectange View。 这是我的代码:activity_main.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <com.example.trashproject.FrameWithTouchControl
            android:id="@+id/frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <View
                android:id="@+id/selector"
                android:layout_width="45dp"
                android:layout_height="match_parent"
                android:background="#33FF0000" >
            </View>

             <HorizontalScrollView
            android:id="@+id/horizontalScroll"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" >

            <TableLayout
                android:id="@+id/table"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal" >
            </TableLayout>
        </HorizontalScrollView>

        </com.example.trashproject.FrameWithTouchControl>
    </LinearLayout>

FrameWithTouchControl.java:

package com.example.trashproject;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;

public class FrameWithTouchControl extends FrameLayout {

    private static final String TAG ="FrameWithTouchControl" ;
    private float curSelectorPositionX1;
    private float curSelectorPositionX2;
    private boolean isDragging = false;
    private View mSelector;
    private int mTouchSlop;

    public FrameWithTouchControl(Context context) {
        super(context);
        init();

    }


    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        initViewMembers();
    }


    public FrameWithTouchControl(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }


    public FrameWithTouchControl(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        init();
    }


    private void initViewMembers() {
        mSelector = this.findViewById(R.id.selector);

    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();
        // Always handle the case of the touch gesture being complete.
        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
            // Release the scroll.
            isDragging = false;
            return false; // Do not intercept touch event, let the child handle it
        }
        curSelectorPositionX1 = mSelector.getLeft();
        curSelectorPositionX2 = mSelector.getRight();
        float evX = ev.getX();
        //if the touch is out of the selector's area
        if (evX >= curSelectorPositionX2 || evX <= curSelectorPositionX1) {
            return false;
        }

        switch (action) {
        case MotionEvent.ACTION_MOVE:
            if (isDragging) {
                // We're currently dragging, so yes, intercept the 
                // touch event!
                mSelector.onTouchEvent(ev);
                return true;
            }

            mSelector.onTouchEvent(ev);
            return true;



        }//switch
        return false;
    }//onIntercept
}

MainActivity.java:

package com.example.trashproject;

import java.util.Calendar;
import java.util.Random;

import android.content.ClipData;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnDragListener;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TableRow.LayoutParams;
import android.widget.TextView;
public class MainActivity extends FragmentActivity{


    private static final int ROWS =8;
    private static final int COLS = 100;
    private static final String TAG = "MainActivity";
    private TableLayout mTable;
    private TextView[][] mCircles;
    private boolean[][] mData;
    private LayoutInflater mInflater;
    private FrameLayout mFrame;
    private View mSelector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mData = generateFakeGuestsTimes();
        mInflater =(LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        makeTable();
        mFrame = (FrameLayout) findViewById(R.id.frame);

        mSelector = findViewById(R.id.selector);
        mSelector.setOnTouchListener(new OnTouchListener() {

            boolean isDragging;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "selector touch triggered" );
                Log.d(TAG, event.toString());
                int action = event.getAction();
                float deltaX = 0;
                if (action==MotionEvent.ACTION_DOWN && !isDragging) {
                    isDragging = true;
                    deltaX = event.getX();
                    return true;
                } else if (isDragging) {
                    if (action== MotionEvent.ACTION_MOVE) {
                        v.setX(v.getX() + event.getX() - deltaX);
                    } else if (action == MotionEvent.ACTION_CANCEL) {
                        isDragging = false;
                        return true;
                    } else if (action == MotionEvent.ACTION_UP) {
                        isDragging = false;
                        return false;
                    }
                }
                return false;
            }
        });


    }
/**** NOT RELEVANT FROM HERE *******/
    private boolean[][] generateFakeGuestsTimes() {
        boolean[][] values = new boolean[ROWS][COLS];
        Random rand = new Random();
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS    ; j++) {
                values[i][j] = rand.nextBoolean();
            }
        }
        return values;

    }
    public void onClick(View view) {
        Log.d(TAG, "numOfChildren" + mTable.getChildCount());
    }


    private void makeTable() {
        mTable = (TableLayout) findViewById(R.id.table);

        TableRow.LayoutParams rowParams = new TableRow.LayoutParams();
        rowParams.width = LayoutParams.WRAP_CONTENT;
        rowParams.height = 67;
        mCircles = new TextView[ROWS][COLS];
        final TableRow[] row = new TableRow[ROWS];
        final TextView[] headerText = new TextView[ROWS];
        long start = cal.getTimeInMillis();
        for (int i = 0; i < ROWS; i++) {
            row[i] = new TableRow(this);
            row[i].setLayoutParams(rowParams);
            for (int j = 0; j < COLS; j++) {
                mCircles[i][j] = (TextView) mInflater.inflate(R.layout.calendar_month_grid, null);
                if (mData[i][j]) {
                    mCircles[i][j].setBackgroundResource(R.drawable.small_circle);
                } else {                    
                    mCircles[i][j].setBackgroundResource(R.drawable.small_circle_red);
                }
                row[i].addView(mCircles[i][j]);
            }
            mTable.addView(row[i]);
        }//outer loop

        long end = cal.getTimeInMillis();
        Log.d(TAG, "time of operation=" + end + ", " + start + ", " + String.valueOf(end - start));
    }

#1楼 票数:0 已采纳

我通过在FrameLayout中切换顺序解决了该问题。 显然,框架布局以相反的顺序设置图层。 即:

<FrameLAyout>
   <View1/>
   <View2/>
</FrameLAyout>

View2将位于上层。 View2将首先获取触摸回调,如果未处理触摸,则View1将获得呼叫。 即与图纸相同。 最底层是View1,最上层是View2。 说得通

  ask by Assaf Shouval translate from so

未解决问题?本站智能推荐:

1回复

JavaFx处理从节点或主节点的FXML控制器拖动节点?

我正在尝试拖动一些自定义节点。 这些节点作为子节点添加到AnchorPane中,如根FXML的Controller中所定义: 我应该在根FXML控制器中还是在可拖动节点本身的FXML控制器中处理节点拖动? 如果应该在根FXML控制器中执行此操作,该怎么做? 调用FXMLLoader.
2回复

在Android中触摸坐标后拖动图像

我正在制作一个应在onTouchEvent(MotionEvent event)方法中触摸坐标后拖动图像的android游戏。 到目前为止,我已经设法通过单击而不是通过拖动来移动它,我该怎么做? 请帮助我,非常感谢! 在以下代码中查看我的onTouchEvent(MotionEvent e
1回复

拖动地图时无法获取地址

我正在尝试制作一个像uber这样的地图,当我们拖动地图时可以在其中获得位置地址。 我已经看到了很多与此相关的链接,并且关注了此链接。 如何实现可拖动的地图,如uber android,使用更改位置进行更新 但是我无法得到结果。 拖动地图时没有任何反应。 也不例外。..无法理解问题。
1回复

无法使用GoogleMapAndroid获取当前位置

我正在开发一个应用程序,可以在其中加载地图时获取当前位置,并在拖动地图时获取位置。 我将标记设置在中心以获取地图的中心点。 与超级应用程序相同。 我已经在此链接中找到了代码,该代码如何实现像uber android这样的可拖动地图,使用更改位置进行更新 但是我无法获得当前位置。 我试
1回复

从服务向UI-Thread发送消息-在服务处理程序中延迟的消息

我有一个从服务器提取数据的服务。 我有gui的活动需要更新。 因此,在不同的场合,例如信息是从服务器成功提取的,服务器必须通知活动有新信息。 为此,我实现了这个功能: 要处理消息,我有消息处理程序: 第一个函数经常调用,我可以在日志记录中看到它按时正常工作。 但是,消息处理
1回复

ArrayAdapter构建无法正确处理click事件的ArrayList

我基本上有1个活动启动另一个活动,并构建一个ArrayList来填充新活动。 我正在尝试处理列表单击事件,并传回从列表中单击的图片或文本名称。 这是我的ArrayAdapter: 如果我可以在此调用中传递一些信息,那就太好了: 意向意向=新意向(上下文,ActivityLocal
1回复

如何在android中正确处理触摸事件?

项目范围 当用户用两个手指触摸Android屏幕时,在每个触摸位置绘制一个“帧”,每个帧都有一个“光标”。 每个帧都是一个自定义滑块,光标将上下移动。 一路上涨将是100%,中间将是0%,一直下跌将是-100%。 这将用于控制小型电机,类似于油箱转动,每个触摸控制一个单独的电机(通过蓝
1回复

如何管理具有更高可读性的android请求代码?

我希望找到一种比我工作的公司所教的方法更好的处理响应的方法。 我被教导要使用通用的HttpClient,它使用凌空来发送请求。 客户端有一个静态方法,该方法将被赋予一个通用的侦听器ResponseListener,当截击响应通过时该方法将回调上下文。 ResponseListener将跟