下面列出了android.view.DragEvent#getX ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public boolean onDragEvent(DragEvent event) {
if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
Point p = new Point((int) event.getX(), (int) event.getY());
if (!roaming) {
roaming = true;
points.add(p);
} else {
try {
points.set(points.size() - 1, p);
} catch (Exception e) {
Reset();
FileLog.e("Yahala", e);
}
}
invalidate();
}
return true;
}
/**
* 获取拖拽触发的执行事件类型
*
* @param draggedViewPager 最外层 {@link com.bigfat.draggedviewpager.view.MDA_DraggedViewPager}
* @param currentPageIndex 当前页索引
* @param pageIndex 响应拖拽事件item所在页索引
* @param view 响应拖拽事件的item
* @param event 拖拽事件
* @return 拖拽事件类型
*/
public static DragEventType getDragEventType(MDA_DraggedViewPager draggedViewPager, int currentPageIndex, int pageIndex,
View view, DragEvent event) {
if (currentPageIndex > 0//有上一页
&& (draggedViewPager.getPageDragSetting() == null || draggedViewPager.getPageDragSetting()
.canBeSwiped(currentPageIndex - 1))//上一页可被交换
//触摸至上一页//或至触摸至当前页左边界,则切换到上一页
&& (pageIndex < currentPageIndex || (pageIndex == currentPageIndex && event.getX() < view.getWidth() / 8))) {
return DragEventType.SCROLL_PREVIOUS;
} else if (currentPageIndex < (draggedViewPager.getContainer().getChildCount() - 1)//在有下一页的前提下
&& (draggedViewPager.getPageDragSetting() == null || draggedViewPager.getPageDragSetting()
.canBeSwiped(currentPageIndex + 1))//下一页可被交换
//触摸至下一页//或至触摸至当前页右边界,则切换到下一页
&& (pageIndex > currentPageIndex || (pageIndex == currentPageIndex && event.getX() > view.getWidth() / 8 * 7))) {
return DragEventType.SCROLL_NEXT;
}
return DragEventType.DEFAULT;
}
/**
* 计算控件位置
*/
private void compute(int type, Rect rect, DragEvent event){
int size = mPhoneContentWidth / WIDTH_COUNT - dp2px(10);
int x = (int) event.getX();
int y = (int) event.getY();
if (type == ONE_BY_ONE_PIC || type == ONE_BY_ONE_TEXT){
// 1 * 1 方格
rect.left = x - size / 2;
rect.top = y - size / 2;
rect.right = x + size / 2;
rect.bottom = y + size / 2;
}else if (type == THREE_BY_THREE_PIC){
// 3 * 3 方格
rect.left = x - size * 3 / 2;
rect.top = y - size * 3 / 2;
rect.right = x + size * 3 / 2;
rect.bottom = y + size * 3 / 2;
}else if (type == ONE_BY_TWO_PIC){
// 1 * 2 方格
rect.left = x - size / 2;
rect.top = y - size;
rect.right = x + size / 2;
rect.bottom = y + size;
}
}
@Override
public boolean onDragEvent (DragEvent event) {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
mLastX = event.getX();
mLastY = event.getY();
return true;
case DragEvent.ACTION_DRAG_ENTERED:
return true;
case DragEvent.ACTION_DRAG_LOCATION:
mLastX = event.getX();
mLastY = event.getY();
mEventListener.onDriverDragMove(event.getX(), event.getY());
return true;
case DragEvent.ACTION_DROP:
mLastX = event.getX();
mLastY = event.getY();
mEventListener.onDriverDragMove(event.getX(), event.getY());
mEventListener.onDriverDragEnd(mLastX, mLastY);
return true;
case DragEvent.ACTION_DRAG_EXITED:
mEventListener.onDriverDragExitWindow();
return true;
case DragEvent.ACTION_DRAG_ENDED:
mEventListener.onDriverDragCancel();
return true;
default:
return false;
}
}
private void hscrollOnDrag(View view, DragEvent event, HorizontalScrollView scrollView) {
float tx = view.getLeft() + event.getX();
if (isAncestor(scrollView, view)) {
int thresh = scrollView.getWidth() / 6;
if (tx < scrollView.getScrollX() + thresh) {
scrollView.smoothScrollBy(-10, 0);
} else if (tx > scrollView.getScrollX() + scrollView.getWidth() - thresh) {
scrollView.smoothScrollBy(10,0);
}
}
}
/**
* 调整控件位置
*/
private void adjust(int type, Rect rect, DragEvent event){
// 最小单元格宽高
int size = mPhoneContentWidth / WIDTH_COUNT / 2;
// 手机屏幕间距
int padding = dp2px(5);
// 1 * 1方格宽高
int width = size * 2 - dp2px(10);
int offsetX = (rect.left - padding) % size;
if (offsetX < size / 2){
rect.left = rect.left + padding - offsetX;
}else {
rect.left = rect.left + padding - offsetX + size;
}
int offsetY = (rect.top - padding) % size;
if (offsetY < size / 2){
rect.top = rect.top + padding - offsetY;
}else {
rect.top = rect.top + padding - offsetY + size;
}
if (type == ONE_BY_ONE_PIC || type == ONE_BY_ONE_TEXT){
rect.right = rect.left + width;
rect.bottom = rect.top + width;
}else if (type == ONE_BY_TWO_PIC){
rect.top = rect.top + padding;
rect.right = rect.left + width;
rect.bottom = rect.top + width * 2;
}else if (type == THREE_BY_THREE_PIC){
rect.top = rect.top + padding * 2;
rect.left = rect.left + padding * 2;
rect.right = rect.left + width * 3;
rect.bottom = rect.top + width * 3;
}
//超出部分修正(超出部分)
if (rect.right > frameLayout.getWidth() || rect.bottom > frameLayout.getHeight()){
int currentX = (int) event.getX();
int currentY = (int) event.getY();
int centerX = frameLayout.getWidth() / 2;
int centerY = frameLayout.getHeight() / 2;
if (currentX <= centerX && currentY <= centerY){
//左上角区域
}else if (currentX >= centerX && currentY <= centerY){
//右上角区域
rect.left = rect.left - size;
rect.right = rect.right - size;
}else if (currentX <= centerX && currentY >= centerY){
//左下角区域
rect.top = rect.top - size;
rect.bottom = rect.bottom - size;
}else if (currentX >= centerX && currentY >= centerY){
//右下角区域
if (rect.right > frameLayout.getWidth()){
rect.left = rect.left - size;
rect.right = rect.right - size;
}
if (rect.bottom > frameLayout.getHeight()){
rect.top = rect.top - size;
rect.bottom = rect.bottom - size;
}
}
}
}
private boolean onDragStart(DragEvent event) {
if (!mRequest.isValid()) {
return false;
}
ClipDescription desc = event.getClipDescription();
if (desc == null || !desc.hasMimeType(getMimeType())) {
return false;
}
final PendingAddItemInfo item;
if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT) {
item = new PendingAddShortcutInfo(
new PinShortcutRequestActivityInfo(mRequest, mLauncher));
} else {
// mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_APPWIDGET
LauncherAppWidgetProviderInfo providerInfo =
LauncherAppWidgetProviderInfo.fromProviderInfo(
mLauncher, mRequest.getAppWidgetProviderInfo(mLauncher));
final PinWidgetFlowHandler flowHandler =
new PinWidgetFlowHandler(providerInfo, mRequest);
item = new PendingAddWidgetInfo(providerInfo) {
@Override
public WidgetAddFlowHandler getHandler() {
return flowHandler;
}
};
}
View view = new View(mLauncher);
view.setTag(item);
Point downPos = new Point((int) event.getX(), (int) event.getY());
DragOptions options = new DragOptions();
options.systemDndStartPoint = downPos;
options.preDragCondition = this;
// We use drag event position as the screenPos for the preview image. Since mPreviewRect
// already includes the view position relative to the drag event on the source window,
// and the absolute position (position relative to the screen) of drag event is same
// across windows, using drag position here give a good estimate for relative position
// to source window.
PendingItemDragHelper dragHelper = new PendingItemDragHelper(view);
if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_APPWIDGET) {
dragHelper.setPreview(getPreview(mRequest));
}
dragHelper.startDrag(new Rect(mPreviewRect),
mPreviewBitmapWidth, mPreviewViewWidth, downPos, this, options);
mDragStartTime = SystemClock.uptimeMillis();
return true;
}
/**
* @param v View
* @param event DragEvent
* @return boolean
*/
@Override
public boolean onDrag(final View v, final DragEvent event)
{
if (v instanceof PipeView)
{
final PipeView pipeView = (PipeView) v;
switch (event.getAction())
{
case DragEvent.ACTION_DRAG_STARTED:
{
//init values
xCoord = 0;
yCoord = 0;
dropped = false;
createRecycleBin(pipeView);
break;
}
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DROP:
//update drop location
xCoord = event.getX();
yCoord = event.getY();
dropped = true;
ComponentView view = (ComponentView) event.getLocalState();
pipeView.getGrid().setGridValue(view.getGridX(), view.getGridY(), false);
break;
case DragEvent.ACTION_DRAG_ENDED:
cleanup(pipeView, event);
break;
case DragEvent.ACTION_DRAG_LOCATION:
{
// //@todo add scroll behaviour to drag and drop
// HorizontalScrollView horizontalScrollView = (HorizontalScrollView) pipeView.getParent();
// if (horizontalScrollView != null)
// {
// ScrollView scrollView = (ScrollView) horizontalScrollView.getParent();
// if (scrollView != null)
// {
// //way one
// int y = Math.round(event.getY());
// int translatedY = y - scrollView.getScrollY();
// int threshold = 50;
// // make a scrolling up due the y has passed the threshold
// if (translatedY < threshold) {
// // make a scroll up by 30 px
// scrollView.smoothScrollBy(0, -30);
// }
// // make a autoscrolling down due y has passed the 500 px border
// if (translatedY + threshold > 500) {
// // make a scroll down by 30 px
// scrollView.smoothScrollBy(0, 30);
// }
// //way two
// int topOfDropZone = pipeView.getTop();
// int bottomOfDropZone = pipeView.getBottom();
// int scrollY = scrollView.getScrollY();
// int scrollViewHeight = scrollView.getMeasuredHeight();
// Log.d("location: Scroll Y: " + scrollY + " Scroll Y+Height: " + (scrollY + scrollViewHeight));
// Log.d(" top: " + topOfDropZone + " bottom: " + bottomOfDropZone);
// if (bottomOfDropZone > (scrollY + scrollViewHeight - 100))
// {
// scrollView.smoothScrollBy(0, 30);
// }
// if (topOfDropZone < (scrollY + 100))
// {
// scrollView.smoothScrollBy(0, -30);
// }
// }
// }
break;
}
default:
break;
}
return true;
}
return false;
}
/**
* @see View#onDragEvent(DragEvent)
*/
@TargetApi(Build.VERSION_CODES.N)
public boolean onDragEvent(DragEvent event) {
if (mNativeContentViewCore == 0 || Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
return false;
}
ClipDescription clipDescription = event.getClipDescription();
// text/* will match text/uri-list, text/html, text/plain.
String[] mimeTypes =
clipDescription == null ? new String[0] : clipDescription.filterMimeTypes("text/*");
if (event.getAction() == DragEvent.ACTION_DRAG_STARTED) {
// TODO(hush): support dragging more than just text.
return mimeTypes != null && mimeTypes.length > 0
&& nativeIsTouchDragDropEnabled(mNativeContentViewCore);
}
StringBuilder content = new StringBuilder("");
if (event.getAction() == DragEvent.ACTION_DROP) {
// TODO(hush): obtain dragdrop permissions, when dragging files into Chrome/WebView is
// supported. Not necessary to do so for now, because only text dragging is supported.
ClipData clipData = event.getClipData();
final int itemCount = clipData.getItemCount();
for (int i = 0; i < itemCount; i++) {
ClipData.Item item = clipData.getItemAt(i);
content.append(item.coerceToStyledText(mContainerView.getContext()));
}
}
int[] locationOnScreen = new int[2];
mContainerView.getLocationOnScreen(locationOnScreen);
float xPix = event.getX() + mCurrentTouchOffsetX;
float yPix = event.getY() + mCurrentTouchOffsetY;
int xCss = (int) mRenderCoordinates.fromPixToDip(xPix);
int yCss = (int) mRenderCoordinates.fromPixToDip(yPix);
int screenXCss = (int) mRenderCoordinates.fromPixToDip(xPix + locationOnScreen[0]);
int screenYCss = (int) mRenderCoordinates.fromPixToDip(yPix + locationOnScreen[1]);
nativeOnDragEvent(mNativeContentViewCore, event.getAction(), xCss, yCss, screenXCss,
screenYCss, mimeTypes, content.toString());
return true;
}