@Override public void onScroll( AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (totalItemCount > visibleItemCount) { showFooterView(); } mFirstVisibleItem = firstVisibleItem; if (mCurrScrollState == SCROLL_STATE_TOUCH_SCROLL && firstVisibleItem == 0 && mHeaderLinearLayout.getBottom() >= 0 && mHeaderLinearLayout.getBottom() < mHeaderHeight) { // 进入且仅进入下拉刷新状态 if (mPullRefreshState == NONE_PULL_REFRESH) { mPullRefreshState = ENTER_PULL_REFRESH; } } else if (mCurrScrollState == SCROLL_STATE_TOUCH_SCROLL && firstVisibleItem == 0 && mHeaderLinearLayout.getBottom() >= mHeaderHeight + 35) { // 下拉达到界限,进入松手刷新状态 if (mPullRefreshState == ENTER_PULL_REFRESH || mPullRefreshState == NONE_PULL_REFRESH) { mPullRefreshState = OVER_PULL_REFRESH; // mDownY = mMoveY; // 为下拉1/3折扣效果记录开始位置 headerInfo.setText("松手刷新"); // 显示松手刷新 rotateArrow(ROTATE_UP); showArrow(); } } else if (mCurrScrollState == SCROLL_STATE_TOUCH_SCROLL && firstVisibleItem == 0 && mHeaderLinearLayout.getBottom() >= 0 && mHeaderLinearLayout.getBottom() < mHeaderHeight + 20) { if (mPullRefreshState == ENTER_PULL_REFRESH || mPullRefreshState == OVER_PULL_REFRESH) { mPullRefreshState = ENTER_PULL_REFRESH; headerInfo.setText("下拉刷新"); // 显示下拉刷新 rotateArrow(ROTATE_DOWN); } } else if (mCurrScrollState == SCROLL_STATE_TOUCH_SCROLL && firstVisibleItem != 0) { if (mPullRefreshState == ENTER_PULL_REFRESH || mPullRefreshState == OVER_PULL_REFRESH) { mPullRefreshState = NONE_PULL_REFRESH; // 停止刷新 } } else if (mCurrScrollState == SCROLL_STATE_FLING && firstVisibleItem == 0) { // 飞滑状态,不能显示出header,也不能影响正常的飞滑,只在正常情况下才纠正位置 if (mPullRefreshState == NONE_PULL_REFRESH) { setSelection(1); } } }
public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub dismissPopupWindow(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mEventStartX = (int) event.getX(); // mEventStartY = (int) event.getY(); break; case MotionEvent.ACTION_UP: // *图表点击坐标 mEventEndX = (int) event.getX(); mEventEndY = (int) event.getY(); System.out.println("1.------------------------------"); // 屏幕是否位移 mScreenOffsetX += mEventEndX - mEventStartX == 0 ? 0 : mEventEndX - mEventStartX; // 是否超出X轴原点(是,归0) mScreenOffsetX = mScreenOffsetX > 0 ? 0 : mScreenOffsetX; System.out.println("############ mOffsetX = " + mScreenOffsetX); if (event.getX() < CHART_MARGINS_LEFT || event.getX() > containerbody.getRight() - CHART_MARGINS_LEFT || event.getY() < CHART_MARGINS_TOP || event.getY() > containerbody.getBottom() - CHART_MARGINS_TOP) { // out of the chartView, do nothing. } else { // 取屏幕宽、高 int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 取图表区域宽、高 int chartViewWidth = mLineChartView.getWidth(); int chartViewHeight = mLineChartView.getHeight(); // 求图表单元格宽、高 int chartCellWidth = (chartViewWidth - CHART_MARGINS_LEFT * 2) / CHART_X_LABELS; int chartCellHeight = (chartViewHeight - CHART_MARGINS_TOP - chart_margins_bottom) / CHART_Y_LABELS; // 是否超出X轴上限(是,取上限值) mScreenOffsetX = mScreenOffsetX < -chartCellWidth * (panXLimit - CHART_X_AXISMAX) ? -chartCellWidth * (panXLimit - CHART_X_AXISMAX) : mScreenOffsetX; System.out.println( "-chartCellWidth * panXLimit = " + -chartCellWidth * (panXLimit - CHART_X_AXISMAX)); System.out.println("@@@@mScreenOffsetX = " + mScreenOffsetX); // *求图表像素坐标 换算成图表单位坐标 int chartEventX = 1 + Math.round((mEventEndX - CHART_MARGINS_LEFT) / chartCellWidth); int chartEventY = CHART_Y_AXISMAX - Math.round((mEventEndY - CHART_MARGINS_TOP) / chartCellHeight * 10); System.out.println("chartEventX = " + chartEventX); System.out.println("chartEventY = " + chartEventY); // 求位移单元格 int chartOffsetX = Math.round(mScreenOffsetX / chartCellWidth); System.out.println("############ chartOffsetX = " + chartOffsetX); System.out.println("2.================================"); // 求图表像素坐标 换算成屏幕像素坐标 int screenEventX = mEventEndX + (screenWidth - chartViewWidth) / 2; int screenEventY = mEventEndY + (screenHeight - chartViewHeight) / 2; // System.out.println("chartEventX = " + event.getX()); // System.out.println("chartEventY = " + event.getY()); // System.out.println("screenEventX = " + screenEventX); // System.out.println("screenEventY = " + screenEventY); boolean mType = true; isShowPopWin: for (int i = 0; i < lineEndX; i++) { int pxSeriesX = ((int) (series.getX(i)) - 1) * chartCellWidth + CHART_MARGINS_LEFT; int pxSeriesY = (CHART_Y_AXISMAX - (int) (series.getY(i))) * chartCellHeight / 10 + CHART_MARGINS_TOP; System.out.println("3.**********************************"); // System.out.println(" mEventEndX = " + mEventEndX); // System.out.println(" pxSeriesX + mScreenOffsetX - chartCellWidth / 2 = " // + (pxSeriesX + mScreenOffsetX - chartCellWidth / 2)); // System.out.println(" pxSeriesX + mScreenOffsetX + chartCellWidth / 2 = " // + (pxSeriesX + mScreenOffsetX + chartCellWidth / 2)); // System.out.println(" mEventEndY = " + mEventEndY); // System.out.println(" pxSeriesY - chartCellHeight / 2 = " // + (pxSeriesY - chartCellHeight / 2)); // System.out.println(" pxSeriesY + chartCellHeight / 2 = " // + (pxSeriesY + chartCellHeight / 2)); if (mEventEndX > pxSeriesX + mScreenOffsetX - chartCellWidth / 2 && mEventEndX < pxSeriesX + mScreenOffsetX + chartCellWidth / 2 && mEventEndY > pxSeriesY - chartCellHeight / 2 && mEventEndY < pxSeriesY + chartCellHeight / 2) { System.out.println(" series.getX(i) = " + series.getX(i)); System.out.println(" pxSeriesX = " + pxSeriesX); mDataMap = mDataMapList.get(i); String bustotal = mDataMap.get("BUSTOTAL").toString(); String busunsuccess = mDataMap.get("BUSUNSUCCESS").toString(); touchPoint = i; // 根据type,判断窗口绿or蓝 if ("0".equals(mDataMap.get("type").toString())) { mType = false; mPopTxt1.setText("预约" + bustotal + "条"); mPopTxt2.setText(busunsuccess + "条"); } else { mType = true; mPopTxt4.setText("已办理" + bustotal + "条"); } if (screenWidth - screenEventX < POPWIN_WIDTH) { mPopupView.setBackgroundDrawable( getResources().getDrawable(R.drawable.switch_on)); mPopupView.setPadding( 0, dip2px(app_query_temperature_Activity.this, 30), dip2px(app_query_temperature_Activity.this, 23), 0); mPopTxt1.setGravity(Gravity.RIGHT); mPopTxt2.setGravity(Gravity.RIGHT); mPopTxt3.setGravity(Gravity.RIGHT); mPopupView1.setBackgroundDrawable( getResources().getDrawable(R.drawable.switch_on)); mPopupView1.setPadding( 0, dip2px(app_query_temperature_Activity.this, 30), dip2px(app_query_temperature_Activity.this, 23), 0); mPopTxt4.setGravity(Gravity.RIGHT); screenEventX -= POPWIN_WIDTH; } else { mPopupView.setBackgroundDrawable( getResources().getDrawable(R.drawable.switch_off)); mPopupView.setPadding( dip2px(app_query_temperature_Activity.this, 23), dip2px(app_query_temperature_Activity.this, 30), 0, 0); mPopTxt1.setGravity(Gravity.LEFT); mPopTxt2.setGravity(Gravity.LEFT); mPopTxt3.setGravity(Gravity.LEFT); mPopupView1.setBackgroundDrawable( getResources().getDrawable(R.drawable.switch_off)); mPopupView1.setPadding( dip2px(app_query_temperature_Activity.this, 20), dip2px(app_query_temperature_Activity.this, 30), 0, 0); mPopTxt4.setGravity(Gravity.LEFT); } mPopupWindow = new PopupWindow(mPopupView, POPWIN_WIDTH, POPWIN_HEIGHT); mPopupWindow1 = new PopupWindow(mPopupView1, POPWIN_WIDTH1, POPWIN_HEIGHT1); if (mType) { if (mPopupWindow1.isShowing()) { mPopupWindow1.update( screenEventX, screenEventY, POPWIN_WIDTH, POPWIN_HEIGHT); } else { mPopupWindow1.showAtLocation( mLineChartView, Gravity.NO_GRAVITY, screenEventX, screenEventY); } } else { // + POPWIN_HEIGHT / 2 if (mPopupWindow.isShowing()) { mPopupWindow.update( screenEventX, screenEventY, POPWIN_WIDTH, POPWIN_HEIGHT); } else { mPopupWindow.showAtLocation( mLineChartView, Gravity.NO_GRAVITY, screenEventX, screenEventY); } } break isShowPopWin; } } } break; default: break; } return false; }