2010-11-04 28 views
1

我在包含ScrollView的Horizo​​ntalScrollView中擁有自定義視圖,並且當觸摸點已移動但未完成滾動(即視圖小於或等於窗口大小)時,我想在onTouchEvent的ACTION_UP上採取行動。沒有移動的一次觸摸就像它應該那樣給ACTION_UP。Android 2.2消耗了ACTION_UP,其中2.1沒有(在嵌套的滾動視圖中)。我使用舊的錯誤嗎?

在2.1下運行(以下)代碼時,我按預期得到了ACTION_UP。當在2.2上運行相同的代碼時,我沒有得到ACTION_UP(我已經在2.2仿真器上用SDK 2.1和2.2進行了測試)。

我是否在2.1版本中意外地使用了「有效的bug」,並且已經修復爲2.2或者這是一個新錯誤?有沒有解決方法?

請參閱以下的logcat:

2.1 
I/CustomActivityView( 225): ACTION_DOWN at 307.000000, 
I/CustomActivityView( 225): ACTION_MOVE at 297.000000, 
I/CustomActivityView( 225): ACTION_MOVE at 292.000000, 
I/CustomActivityView( 225): ACTION_MOVE at 290.000000, 
I/CustomActivityView( 225): ACTION_MOVE at 289.000000, 
I/CustomActivityView( 225): ACTION_MOVE at 286.000000, 
I/CustomActivityView( 225): ACTION_UP at 286.000000, 

2.2 
/CustomActivityView( 279): ACTION_DOWN at 249.000000, 
/CustomActivityView( 279): ACTION_MOVE at 249.000000, 
/CustomActivityView( 279): ACTION_MOVE at 249.000000, 
/CustomActivityView( 279): ACTION_MOVE at 249.000000, 
/CustomActivityView( 279): ACTION_DOWN at 198.000000, 
/CustomActivityView( 279): ACTION_MOVE at 199.000000, 
/CustomActivityView( 279): ACTION_MOVE at 207.000000, 
/CustomActivityView( 279): ACTION_MOVE at 214.000000, 
/CustomActivityView( 279): ACTION_MOVE at 221.000000, 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:background="#ffdddddd" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <ScrollView android:id="@+id/ScrollView" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
     <HorizontalScrollView android:id="@+id/HorizontalScrollView" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
      <com.example.eventconsumption.CustomActivityView 
      android:background="#ffaaaaff" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:id="@+id/CustomActivityView" 
      /> 
     </HorizontalScrollView> 
    </ScrollView> 
</LinearLayout> 

的視圖:

package com.example.eventconsumption; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.Display; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 

public class CustomActivityView extends View { 
    private static final String TAG = "CustomActivityView"; 
    private int mSetViewWidth = -1; 
    private int mSetViewHeight = -1; 
    private int mScreenWidth; 
    private int mScreenHeight; 

    public CustomActivityView(Context context) { 
     super(context); 
     init(context); 
    } 

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

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

    private void init(Context context) { 
     WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     mScreenWidth = display.getWidth(); 
     mScreenHeight = display.getHeight(); 

     setWidthHeight(mScreenWidth/2, mScreenHeight * 2); 
     //setWidthHeight(mScreenWidth * 2, mScreenHeight/2); 
    } 

    private void setWidthHeight(int w, int h) { 
     mSetViewWidth = w; 
     mSetViewHeight = h; 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if (mSetViewWidth != -1 && mSetViewHeight != -1) { 
      setMeasuredDimension(mSetViewWidth, mSetViewHeight); 
     } else { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      Log.i(TAG, String.format("ACTION_DOWN at %f, %f", event.getX(), event.getY())); 
      return true; 
     case MotionEvent.ACTION_MOVE: 
      Log.i(TAG, String.format("ACTION_MOVE at %f, %f", event.getX(), event.getY())); 
      break; 
     case MotionEvent.ACTION_UP: 
      Log.i(TAG, String.format("ACTION_UP at %f, %f", event.getX(), event.getY())); 
      return true; 
     } 

     return super.onTouchEvent(event); 
    } 
} 

活性:

package com.example.eventconsumption; 

import android.app.Activity; 
import android.os.Bundle; 

public class EventConsumptionTestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 
+1

我發現同樣的事情; linearLayout在2.2中不提供MotionEvent.ACTION_UP,但是,我希望它能做到! – 2011-04-28 22:12:55

回答

1

好吧,所以我的解決方法是使用OnTouchListener,如果Android版本高於eclair,則使用舊代碼。 登記時

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR_MR1) { 
    mUseOnTouchListener = true; 
    mHorizontalScrollView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // ACTION_UP check here etc... 

的舊代碼

case MotionEvent.ACTION_UP: 
    if (!mUseOnTouchListener) { 

等等...

相關問題