Why do not these codes work?

Put problem concerning Views, Layouts and other XML-Resources (like AndroidManifest) here.

Why do not these codes work?

Postby Jay » Mon Dec 15, 2008 10:28 am

Hi all ,

I am trying to realise a viewgroup which can scroll and integrate with touch events like the home page .
And i copy some code from the source of the Home application for experiments.

And i cut some non-scrollling code of them off .But it doesn't work .PLZ help me for some suggestion.

It works well with draging but not flinging .That is strange .Seems like the method mScroller.startScroll do not work well .
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package com.xxx.test;
  3.  
  4.  
  5.  
  6. import android.content.Context;
  7.  
  8. import android.util.Log;
  9.  
  10. import android.view.MotionEvent;
  11.  
  12. import android.view.VelocityTracker;
  13.  
  14. import android.view.View;
  15.  
  16. import android.view.ViewGroup;
  17.  
  18. import android.widget.Scroller;
  19.  
  20.  
  21.  
  22. public class DragableSpace extends ViewGroup {
  23.  
  24.         private Scroller mScroller;
  25.  
  26.         private VelocityTracker mVelocityTracker;
  27.  
  28.                
  29.  
  30.         private int mScrollX = 0;
  31.  
  32.         private int mCurrentScreen = 0;
  33.  
  34.        
  35.  
  36.         private float mLastMotionX;
  37.  
  38.    
  39.  
  40.    
  41.  
  42.     private static final String LOG_TAG = "DragableSpace";
  43.  
  44.    
  45.  
  46.     private static final int SNAP_VELOCITY = 1000;
  47.  
  48.    
  49.  
  50.     private final static int TOUCH_STATE_REST = 0;
  51.  
  52.     private final static int TOUCH_STATE_SCROLLING = 1;
  53.  
  54.    
  55.  
  56.     private int mTouchState = TOUCH_STATE_REST;
  57.  
  58.    
  59.  
  60.         public DragableSpace(Context context) {
  61.  
  62.                 super(context);
  63.  
  64.                 mScroller = new Scroller(context);
  65.  
  66.  
  67.  
  68.                 this.setLayoutParams(new ViewGroup.LayoutParams(
  69.  
  70.                                 ViewGroup.LayoutParams.WRAP_CONTENT ,
  71.  
  72.                                 ViewGroup.LayoutParams.FILL_PARENT));
  73.  
  74.                
  75.  
  76.         }
  77.  
  78.                        
  79.  
  80.  
  81.  
  82.         @Override
  83.  
  84.         public boolean onTouchEvent(MotionEvent event) {
  85.  
  86.                        
  87.  
  88.                    if(mVelocityTracker==null){
  89.  
  90.                            mVelocityTracker = VelocityTracker.obtain();
  91.  
  92.                    }
  93.  
  94.                    mVelocityTracker.addMovement(event);
  95.  
  96.  
  97.  
  98.                final int action = event.getAction();
  99.  
  100.                final float x = event.getX();
  101.  
  102.                
  103.  
  104.                switch (action) {
  105.  
  106.                 case MotionEvent.ACTION_DOWN:
  107.  
  108.                         Log.i(LOG_TAG,"event : down");
  109.  
  110.                     /*
  111.  
  112.                      * If being flinged and user touches, stop the fling. isFinished
  113.  
  114.                      * will be false if being flinged.
  115.  
  116.                      */
  117.  
  118.                     if (!mScroller.isFinished()) {
  119.  
  120.                         mScroller.abortAnimation();
  121.  
  122.                     }
  123.  
  124.  
  125.  
  126.                     // Remember where the motion event started
  127.  
  128.                     mLastMotionX = x;
  129.  
  130.                     break;
  131.  
  132.                 case MotionEvent.ACTION_MOVE:
  133.  
  134.                         Log.i(LOG_TAG,"event : move");
  135.  
  136.                     //if (mTouchState == TOUCH_STATE_SCROLLING) {
  137.  
  138.                         // Scroll to follow the motion event
  139.  
  140.                         final int deltaX = (int) (mLastMotionX - x);
  141.  
  142.                         mLastMotionX = x;
  143.  
  144.  
  145.  
  146.                         if (deltaX < 0) {
  147.  
  148.                             if (mScrollX > 0) {
  149.  
  150.                                 scrollBy(Math.max(-mScrollX, deltaX), 0);
  151.  
  152.                             }
  153.  
  154.                         } else if (deltaX > 0) {
  155.  
  156.                             final int availableToScroll = getChildAt(getChildCount() - 1).getRight() -
  157.  
  158.                                     mScrollX - getWidth();
  159.  
  160.                             if (availableToScroll > 0) {
  161.  
  162.                                 scrollBy(Math.min(availableToScroll, deltaX), 0);
  163.  
  164.                             }
  165.  
  166.                         }
  167.  
  168.                     //}
  169.  
  170.                     break;
  171.  
  172.                 case MotionEvent.ACTION_UP:
  173.  
  174.                         Log.i(LOG_TAG,"event : up");
  175.  
  176.                     //if (mTouchState == TOUCH_STATE_SCROLLING) {
  177.  
  178.                         final VelocityTracker velocityTracker = mVelocityTracker;
  179.  
  180.                         velocityTracker.computeCurrentVelocity(1000);
  181.  
  182.                         int velocityX = (int) velocityTracker.getXVelocity();
  183.  
  184.  
  185.  
  186.                         if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) {
  187.  
  188.                             // Fling hard enough to move left
  189.  
  190.                             snapToScreen(mCurrentScreen - 1);
  191.  
  192.                         } else if (velocityX < -SNAP_VELOCITY && mCurrentScreen < getChildCount() - 1) {
  193.  
  194.                             // Fling hard enough to move right
  195.  
  196.                             snapToScreen(mCurrentScreen + 1);
  197.  
  198.                         } else {
  199.  
  200.                             snapToDestination();
  201.  
  202.                         }
  203.  
  204.  
  205.  
  206.                         if (mVelocityTracker != null) {
  207.  
  208.                             mVelocityTracker.recycle();
  209.  
  210.                             mVelocityTracker = null;
  211.  
  212.                         }
  213.  
  214.                     //}
  215.  
  216.                     mTouchState = TOUCH_STATE_REST;
  217.  
  218.                     break;
  219.  
  220.                 case MotionEvent.ACTION_CANCEL:
  221.  
  222.                         Log.i(LOG_TAG,"event : cancle");
  223.  
  224.                     mTouchState = TOUCH_STATE_REST;
  225.  
  226.                 }
  227.  
  228.                mScrollX = this.getScrollX();
  229.  
  230.  
  231.  
  232.                 return true;
  233.  
  234.         }
  235.  
  236.        
  237.  
  238.         private void snapToDestination() {
  239.  
  240.         final int screenWidth = getWidth();
  241.  
  242.         final int whichScreen = (mScrollX + (screenWidth / 2)) / screenWidth;
  243.  
  244.         Log.i(LOG_TAG,"from des");
  245.  
  246.         snapToScreen(whichScreen);
  247.  
  248.     }
  249.  
  250.        
  251.  
  252.         private void snapToScreen(int whichScreen) {         
  253.  
  254.                         Log.i(LOG_TAG,"curt to screen:"+ mCurrentScreen);
  255.  
  256.                         Log.i(LOG_TAG,"snap to screen:"+ whichScreen);  
  257.  
  258.                         mCurrentScreen = whichScreen;
  259.  
  260.                 final int newX = whichScreen * getWidth();
  261.  
  262.                 final int delta = newX - mScrollX;
  263.  
  264.                 Log.i(LOG_TAG,"total chld "+ this.getChildCount());
  265.  
  266.                 Log.i(LOG_TAG,"curt X "+ mScrollX);
  267.  
  268.                 Log.i(LOG_TAG,"snap to newX "+ newX);
  269.  
  270.                 Log.i(LOG_TAG,"delta to scroll "+ delta);
  271.  
  272.                 Log.i(LOG_TAG,"duration "+ Math.abs(delta) * 2);
  273.  
  274.                 mScroller.startScroll(mScrollX, 0, delta, 0, Math.abs(delta) * 2);             
  275.  
  276.                 invalidate();
  277.  
  278.                 Log.i(LOG_TAG,"scroller finished "+mScroller.isFinished());
  279.  
  280.                 Log.i(LOG_TAG,"scroller duration "+mScroller.getDuration());
  281.  
  282.                 Log.i(LOG_TAG,"scroller finalX "+mScroller.getFinalX());
  283.  
  284.                
  285.  
  286.             }
  287.  
  288.  
  289.  
  290.  
  291.  
  292.         @Override
  293.  
  294.         protected void onLayout(boolean changed, int l, int t, int r, int b) {
  295.  
  296.                  int childLeft = 0;
  297.  
  298.  
  299.  
  300.                 final int count = getChildCount();
  301.  
  302.                 for (int i = 0; i < count; i++) {
  303.  
  304.                     final View child = getChildAt(i);
  305.  
  306.                     if (child.getVisibility() != View.GONE) {
  307.  
  308.                         final int childWidth = child.getMeasuredWidth();
  309.  
  310.                         child.layout(childLeft, 0, childLeft + childWidth, child.getMeasuredHeight());
  311.  
  312.                         childLeft += childWidth;
  313.  
  314.                     }
  315.  
  316.                 }
  317.  
  318.                
  319.  
  320.         }
  321.  
  322.        
  323.  
  324.  
  325.  
  326.     @Override
  327.  
  328.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  329.  
  330.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  331.  
  332.  
  333.  
  334.         final int width = MeasureSpec.getSize(widthMeasureSpec);
  335.  
  336.         final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  337.  
  338.         if (widthMode != MeasureSpec.EXACTLY) {
  339.  
  340.             throw new IllegalStateException("error mode.");
  341.  
  342.         }
  343.  
  344.  
  345.  
  346.         final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
  347.  
  348.         if (heightMode != MeasureSpec.EXACTLY) {
  349.  
  350.             throw new IllegalStateException("error mode.");
  351.  
  352.         }
  353.  
  354.  
  355.  
  356.         // The children are given the same width and height as the workspace
  357.  
  358.         final int count = getChildCount();
  359.  
  360.         for (int i = 0; i < count; i++) {
  361.  
  362.             getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
  363.  
  364.         }
  365.  
  366.             scrollTo(mCurrentScreen * width, 0);      
  367.  
  368.     }  
  369.  
  370.        
  371.  
  372. }
  373.  
  374.  
Parsed in 0.058 seconds, using GeSHi 1.0.8.4


To use this view just initial this view with context and add some view in this by code .
Jay
Developer
Developer
 
Posts: 28
Joined: Wed Apr 23, 2008 3:51 am

Top

[SOLUTION]

Postby rude » Sun Aug 23, 2009 11:47 pm

I've just added this code and it starts work well:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2.      @Override
  3.  
  4.      public void computeScroll() {
  5.  
  6.          if (mScroller.computeScrollOffset()) {
  7.  
  8.              mScrollX = mScroller.getCurrX();
  9.  
  10.              scrollTo(mScrollX, 0);
  11.  
  12.              postInvalidate();
  13.  
  14.          } else if (mNextScreen != INVALID_SCREEN) {
  15.  
  16.              mCurrentScreen = Math.max(0, Math.min(mNextScreen, getChildCount() - 1));
  17.  
  18.              mNextScreen = INVALID_SCREEN;
  19.  
  20.          }
  21.  
  22.      }
  23.  
  24.  
Parsed in 0.033 seconds, using GeSHi 1.0.8.4


Kind Regards,
Steven
rude
Once Poster
Once Poster
 
Posts: 1
Joined: Wed Aug 05, 2009 2:59 pm

Top

Return to View, Layout & Resource Problems

Who is online

Users browsing this forum: No registered users and 9 guests