/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.gallery3d.filtershow.state; import android.view.DragEvent; import android.view.View; import android.widget.ArrayAdapter; import android.widget.LinearLayout; class DragListener implements View.OnDragListener { private static final String LOGTAG = "DragListener"; private PanelTrack mStatePanelTrack; private static float sSlope = 0.2f; public DragListener(PanelTrack statePanelTrack) { mStatePanelTrack = statePanelTrack; } private void setState(DragEvent event) { float translation = event.getY() - mStatePanelTrack.getTouchPoint().y; float alpha = 1.0f - (Math.abs(translation) / mStatePanelTrack.getCurrentView().getHeight()); if (mStatePanelTrack.getOrientation() == LinearLayout.VERTICAL) { translation = event.getX() - mStatePanelTrack.getTouchPoint().x; alpha = 1.0f - (Math.abs(translation) / mStatePanelTrack.getCurrentView().getWidth()); mStatePanelTrack.getCurrentView().setTranslationX(translation); } else { mStatePanelTrack.getCurrentView().setTranslationY(translation); } mStatePanelTrack.getCurrentView().setBackgroundAlpha(alpha); } @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: { break; } case DragEvent.ACTION_DRAG_LOCATION: { if (mStatePanelTrack.getCurrentView() != null) { setState(event); View over = mStatePanelTrack.findChildAt((int) event.getX(), (int) event.getY()); if (over != null && over != mStatePanelTrack.getCurrentView()) { StateView stateView = (StateView) over; if (stateView != mStatePanelTrack.getCurrentView()) { int pos = mStatePanelTrack.findChild(over); int origin = mStatePanelTrack.findChild( mStatePanelTrack.getCurrentView()); ArrayAdapter array = (ArrayAdapter) mStatePanelTrack.getAdapter(); if (origin != -1 && pos != -1) { State current = (State) array.getItem(origin); array.remove(current); array.insert(current, pos); mStatePanelTrack.fillContent(false); mStatePanelTrack.setCurrentView(mStatePanelTrack.getChildAt(pos)); } } } } break; } case DragEvent.ACTION_DRAG_ENTERED: { mStatePanelTrack.setExited(false); if (mStatePanelTrack.getCurrentView() != null) { mStatePanelTrack.getCurrentView().setVisibility(View.VISIBLE); } return true; } case DragEvent.ACTION_DRAG_EXITED: { if (mStatePanelTrack.getCurrentView() != null) { setState(event); mStatePanelTrack.getCurrentView().setVisibility(View.INVISIBLE); } mStatePanelTrack.setExited(true); break; } case DragEvent.ACTION_DROP: { break; } case DragEvent.ACTION_DRAG_ENDED: { if (mStatePanelTrack.getCurrentView() != null && mStatePanelTrack.getCurrentView().getAlpha() > sSlope) { setState(event); } mStatePanelTrack.checkEndState(); break; } default: break; } return true; } }