android – 如何创建自定义拖动阴影?

android – 如何创建自定义拖动阴影?,第1张

概述我想要实现的目标: 我想在Android中创建拖放功能.我想使用特定的布局(与拖动的对象本身不同)作为拖动阴影. 我得到了什么结果: 我的方法都没有按预期工作 – 我最终没有可见的拖动阴影(虽然目标确实接收到了掉落). 我尝试了什么: 我试过了 >在活动中展开drag_item布局,然后将其作为参数传递给阴影构建器的构造函数 和 >在阴影构建器的onDrawShadow方法中展开drag_item 我想要实现的目标:

我想在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 – 如何创建自定义拖动阴影?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1135530.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存