代码之家  ›  专栏  ›  技术社区  ›  icecream

Android 2.2在2.1没有的地方(在嵌套滚动视图中)消耗动作。我用的是一只老虫子吗?

  •  1
  • icecream  · 技术社区  · 15 年前

    我在水平滚动视图中有一个用滚动视图包装的自定义视图,我想在触摸点移动但没有滚动时,即当视图小于或等于窗口大小时,在Ontouchevent中执行操作。一键不动,动作自然。

    当在2.1下运行(以下)代码时,我得到了预期的操作。在2.2上运行相同的代码时,我没有得到操作(我已经在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,
    

    主.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 回复  |  直到 15 年前
        1
  •  1
  •   icecream    15 年前

    好的,所以我的解决方法是,如果Android版本高于Eclair,使用OnTouchListener,否则使用旧代码。 注册时

    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) {
    

    等等……