
我想在Android中创建拖放功能.我想使用特定的布局(与拖动的对象本身不同)作为拖动阴影.
我得到了什么结果:
我的方法都没有按预期工作 – 我最终没有可见的拖动阴影(虽然目标确实接收到了掉落).
我尝试了什么:
我试过了
>在活动中展开drag_item布局,然后将其作为参数传递给阴影构建器的构造函数
和
>在阴影构建器的onDrawShadow方法中展开drag_item布局,然后在画布上绘制它
布局:
我的活动布局:
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:ID="@+ID/container" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" tools:context="com.example.app.DragDropTestActivity" tools:ignore="MergeRootFrame"> <TextVIEw androID:ID="@+ID/tvReceiver" androID:text="Drop here" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content"/> <button androID:ID="@+ID/btnDragged" androID:layout_height="wrap_content" androID:text="Drag me" androID:layout_wIDth="match_parent"/></linearLayout>
我想用作拖动阴影的布局:
dragged_item.xml
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:orIEntation="vertical" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <TextVIEw androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Dragged Item"/></linearLayout>
源代码:
这是两种方法的代码(分别用1,BuilderOne和2,BuilderTwo表示):
package com.example.app;import androID.graphics.Canvas;import androID.graphics.Point;import androID.os.Bundle;import androID.support.v7.app.ActionBaractivity;import androID.vIEw.LayoutInflater;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.Widget.button;public class DragDropTestActivity extends ActionBaractivity{ @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_drag_drop_test); button dragged = (button) findVIEwByID(R.ID.btnDragged); dragged.setontouchListener( new VIEw.OntouchListener() { @OverrIDe public boolean ontouch(VIEw v,MotionEvent event) { if (event.getAction() != MotionEvent.ACTION_DOWN) { return false; } LayoutInflater inflater = getLayoutInflater(); int approach = 1; // both approaches fail switch (approach) { case 1: { VIEw draggedItem = inflater.inflate(R.layout.dragged_item,null); BuilderOne builder = new BuilderOne(draggedItem); v.startDrag(null,builder,null,0); break; } case 2: { BuilderTwo builder = new BuilderTwo(inflater,v); v.startDrag(null,0); break; } } return true; } }); } 我的BuilderOne课程:
public static class BuilderOne extends VIEw.DragShadowBuilder { public BuilderOne(VIEw vIEw) { super(vIEw); } @OverrIDe public voID onProvIDeShadowMetrics(Point shadowSize,Point shadowtouchPoint) { super.onProvIDeShadowMetrics( shadowSize,shadowtouchPoint); } } 和BuilderTwo类:
public static class BuilderTwo extends VIEw.DragShadowBuilder { final LayoutInflater inflater; public BuilderTwo(LayoutInflater inflater,VIEw vIEw) { super(vIEw); this.inflater = inflater; } @OverrIDe public voID onProvIDeShadowMetrics(Point shadowSize,shadowtouchPoint); } @OverrIDe public voID onDrawShadow(Canvas canvas) { final VIEw draggedItem = inflater.inflate(R.layout.dragged_item,null); if (draggedItem != null) { draggedItem.draw(canvas); } } }} 题:
我做错了什么?
更新:
赏金补充道.
解决方法 Kurty是正确的,因为在这种情况下你不需要继承DragShadowBuilder.我的想法是你传递给DragShadowBuilder的视图实际上并不存在于布局中,因此它不会渲染.不是将null作为第二个参数传递给inflater.inflate,而是尝试将膨胀的VIEw添加到某个层次结构中,然后将其传递给常规的DragShadowBuilder:
VIEw dragVIEw = findVIEwByID(R.ID.dragged_item);mDragShadowBuilder = new DragShadowBuilder(dragVIEw);v.startDrag(null,mDragShadowBuilder,0);
编辑
我知道让dragged_item视图一直在渲染,这不是你想要的,但如果它有效,那么至少我们知道问题出在哪里,并且可以寻找解决方案!
总结以上是内存溢出为你收集整理的android – 如何创建自定义拖动阴影?全部内容,希望文章能够帮你解决android – 如何创建自定义拖动阴影?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)