2011-04-13 12 views
11

버튼이있는 화면이 있지만 onTouch 메서드가 전체 화면 좌표를 사용하도록하고 싶습니다. 먼저 onTouchListener를 사용하여 RelativeLayout을 사용해 보았지만 리스너와 "연결"되도록 관리하지 않았습니다. (즉, 화면을 터치하면 아무 일도 일어나지 않았습니다.) 화면 상단에 ImageView를 놓고이보기를 보이지 않게했습니다. .onTouchListener 전체 화면 용

이 마지막 방법은 onClicks에 올바른 응답을 주었지만 결코 보이지 않게 만들었습니다.

내가 가장 의심 스럽지만 최고의 솔루션 인 경우 onTouchListener를 잃지 않고 ImageView를 완전히 보이지 않게 만드는 방법은 무엇입니까 (white backgroundColor 및 setAlpha (0)로 실험했습니다).

화면에 여러 개의 버튼 (보이지 않는 이미지 뷰가없는 것이 좋음)이 표시되는 동안 어쨌든 전역 좌표를 사용하여 onTouchListener를 전체 화면에 반응시킬 수 있습니까?

내가 무엇을 요구하는지 이해하지 못한다면, 그것에 대해 불평 해주십시오. 필요에 따라 공백을 채우려고 노력할 것입니다.

편집 :

지금은 일반 onTouch-방법을 사용하여 문제를 해결하기 위해 관리했습니다. ACTION_DOWN 및 ACTION_MOVE 버튼을 활성화하는 데 몇 가지 문제가 발생했지만 마침내 제대로 작동했습니다. 이것을 읽는 다른 사람들을 위해 : onInterceptTouchEvent를 사용할 수도 있습니다 (그러나 뷰 좌표 대신 화면 좌표를 얻는 방법을 찾지 못했습니다).

답변

8

내가 틀렸다면 미안하지만 비슷한 문제가 있다고 생각합니다. 나는 그림을 표시하는 제목 화면과 "계속하려면 클릭하십시오"또는 비슷한 것을 말한 그림 단어를 원했습니다. 나는 조금 뒤죽박죽이고 당신이 레이아웃을 클릭 할 수있게 만들 수 있다는 것을 알았다.

android:focusable="true" 
    android:id="@+id/titlescreenframe"> 

은 내 레이아웃에 대한 내 xml 파일입니다. 버튼 배경 이미지는 다시 내 활동, 어쨌든 배경 속성 (난 당신이 이미지를 사용하지 않는 실현)

단순히

private FrameLayout fl; 
    ... 
    fl = (FrameLayout)findViewById(R.id.titlescreenframe); 
    fl.setOnClickListener(this); 

입니다 그리고 나는 그것을 처리하기 위해 스위치 문을 사용하고 다음 레이아웃에 있습니다. 여기에 필요할 경우 : Using Switch Statement to Handle Button Clicks

다른 레이아웃에서도 작동해야하며, 메인 레이아웃에 아무런 뷰가 없다고합니다. (레이아웃 자체가 하나로 간주되지 않는 한?)

하! 해결책을 찾았다 고했다는 걸 깨달았습니다. 어리석은 타이밍. 나는이 기회를 통해 누군가에게 도움을주고, 모두를 행복하게 코딩 할 수 있도록 게시 할 것입니다. :)

+2

타겟이 1.6보다 새로운 경우에는 focusable을 설정하는 대신 android : onClick = "functionname"을 직접 사용할 수 있으며 onclick 리스너를 코드에 할당 할 수 있습니다. – Yenchi

3

레이아웃에서 onInterceptTouchEvent을 사용해 보셨습니까?

+0

Dsouza을 작동하지만 만족하지 않았다. 나는 이제 일반 onTouch 메서드를 사용하여 문제를 해결할 수있었습니다. ACTION_DOWN 및 ACTION_MOVE 버튼을 활성화하는 데 몇 가지 문제가 발생했지만 마침내 제대로 작동했습니다. 이것을 읽는 다른 사람들을 위해 : onInterceptTouchEvent를 사용할 수도 있습니다 (그러나 뷰 좌표 대신 화면 좌표를 얻는 방법을 찾지 못했습니다). – keyser

3

비슷한 문제로 dispatchTouchEvent을 사용했습니다. onTouchEvent의 드롭 인 대체로 간주 할 수 있습니다. 단, 기존보기 위에 있어도 항상 일정을 보냅니다.

이벤트를 처리하는 경우 true를 반환하고, 그렇지 않으면 super.dispatchTouchEvent()을 호출하고 결과를 반환해야합니다.화면을 얻기에 관해서는

는 좌표 - 단순히 호출 MotionEvent의 getRawX()getRawY()보다는 getX()getY(). 그것들은 작업 표시 줄과 모두를 포함한 절대 화면 좌표입니다. 보기를 통해 이들을 상호 참조하려면 getLocationOnScreen이 가장 쉬운 솔루션 일 것입니다.

1

먼저 터치 이벤트 반환을 하위보기로 반환합니다. 그들을 위해 onClick 또는 onTouch 리스너를 정의하면 parnt 뷰 (예 : fragment)는 터치 리스너를 수신하지 않습니다. 이 상황에서 조각에 대한 슬쩍 리스너를 정의하고자한다면, 당신은 새로운 클래스를 구현해야합니다

package com.neganet.QRelations.fragments; 

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

public class SwipeListenerFragment extends FrameLayout { 
    private float x1,x2; 
    static final int MIN_DISTANCE=150; 
    private onSwipeEventDetected mSwipeDetectedListener; 


    public SwipeListenerFragment(Context context) { 
     super(context); 
    } 

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

    public SwipeListenerFragment(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     boolean result=false; 
     switch(ev.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN: 
       x1 = ev.getX(); 
       break; 
      case MotionEvent.ACTION_UP: 
       x2 = ev.getX(); 
       float deltaX = x2 - x1; 
       if (Math.abs(deltaX) > MIN_DISTANCE) 
       { 
        if(deltaX<0) 
        { 
         result=true; 
         if(mSwipeDetectedListener!=null) 
          mSwipeDetectedListener.swipeLeftDetected(); 

        }else if(deltaX>0){ 
         result=true; 
         if(mSwipeDetectedListener!=null) 
          mSwipeDetectedListener.swipeRightDetected(); 
        } 
       } 
       break; 
     } 
     return result; 
    } 

    public interface onSwipeEventDetected 
    { 
     public void swipeLeftDetected(); 
     public void swipeRightDetected(); 

    } 

    public void registerToSwipeEvents(onSwipeEventDetected listener) 
    { 
     this.mSwipeDetectedListener=listener; 
    } 
} 

완전히 같은 레이아웃의 다른 유형의 구현을 만들 수 있습니다. 이 클래스는 오른쪽 및 왼쪽 스 와이프를 모두 감지 할 수 있으며 특히 감지 후에는 onInterceptTouchEvent true를 반환합니다. 왜냐하면 우리가 그것을하지 않으면 몇 번 자식 뷰가 이벤트를받을 것이고 조각을위한 스 와이프와 자식 뷰를위한 onClick (둘 다)이 실행되어 몇 가지 문제를 일으킬 수 있기 때문입니다. 당신이이 태그를 시작 참조

<com.neganet.QRelations.fragments.SwipeListenerFragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:id="@+id/main_list_layout" 
    android:clickable="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:layout_height="match_parent" tools:context="com.neganet.QRelations.fragments.mainList" 
    android:background="@color/main_frag_back"> 

    <!-- TODO: Update blank fragment layout --> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/farazList" 
     android:scrollbars="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="left|center_vertical" /> 
</com.neganet.QRelations.fragments.SwipeListenerFragment> 

우리가 만든 클래스입니다 : 이 클래스를 한 후, 당신은 당신의 조각 XML 파일을 변경해야합니다. 지금 조각 클래스 :

  View view=inflater.inflate(R.layout.fragment_main_list, container, false); 
     SwipeListenerFragment tdView=(SwipeListenerFragment) view; 
     tdView.registerToSwipeEvents(this); 


and then Implement SwipeListenerFragment.onSwipeEventDetected in it: 

     @Override 
    public void swipeLeftDetected() { 
     Toast.makeText(getActivity(), "left", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void swipeRightDetected() { 
     Toast.makeText(getActivity(), "right", Toast.LENGTH_SHORT).show(); 
    } 

그것은 조금 복잡하지만 난 그것을 시도 완벽한 :)