Android 是否可以使拖曳阴影不透明?

Android 是否可以使拖曳阴影不透明?,android,Android,正如问题所述。这是我的dragshadowbuilder供参考。如您所知,拖动时创建的阴影是半透明的。有没有办法让它不透明?(全固态) 编辑:这是我当前的onTouch代码,我还将提供应用程序的背景 OnTouchListener myOnTouchListener = new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent e

正如问题所述。这是我的dragshadowbuilder供参考。如您所知,拖动时创建的阴影是半透明的。有没有办法让它不透明?(全固态)

编辑:这是我当前的onTouch代码,我还将提供应用程序的背景

OnTouchListener myOnTouchListener = new OnTouchListener() {

                @Override
                public boolean onTouch(View view, MotionEvent event) {
                    System.out.println(event.toString());
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        ImageView b = (ImageView)view;
                        int x = Character.getNumericValue(b.getContentDescription().charAt(0));
                        int y = Character.getNumericValue(b.getContentDescription().charAt(1));
                        if (!currentBoardState[x][y].isEmpty()) {
                            ((ImageView)view).setImageBitmap(null);
                            DragShadowBuilder shadowBuilder = new MyDragShadowBuilder(view);  
                            view.startDrag(null, shadowBuilder, view, 0);
                        }

                        moveChessPiece;
                        return true;
                    }

                    return false;
                }
            });

好的,这是你需要知道的。我正在开发一个国际象棋应用程序。我有一个8x8网格布局,我将其命名为
currentBoardState
。因此,目前我希望能够拖动该块,这是可行的,但我希望拖动的块是不透明的,这样用户就可以感觉到他/她实际上正在移动该块,而不是像我以前那样单击然后单击目标。

不,不幸的是,据我所知,这是不可能的

阴影
位图
绘制在您无法触及的曲面上。唯一的解决方案是像API 11之前那样实现拖放。其实并不像你想象的那么难

以下是一些帮助您入门的链接:


*更新了

正如@Ernir所说,没有API get DragShadow。但是我们知道拖动位置和拖动视图,所以我们可以自己绘制

我写了一个简单的和功能有限的演示你可以下载它

它实现了一个名为DragContainer的自定义视图组,使用它将原始根视图包装到布局xml中

<info.dourok.android.demo.DragContainer xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- original root view -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
         <!-- ... -->
    </RelativeLayout>

</info.dourok.android.demo.DragContainer>
您还可以扩展DragContainer以绘制自定义的拖曳阴影,这是一个满足您需求的示例

public class MyDragContainer extends DragContainer {
    public MyDragContainer(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyDragContainer(Context context) {
        super(context, null);
    }

    public MyDragContainer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    int width;
    int height;
    Bitmap bitmap;

    @Override
    protected void onSetDragTarget(View v) {
        ImageView b = (ImageView) v;
        int x = Character.getNumericValue(b.getContentDescription().charAt(0));
        int y = Character.getNumericValue(b.getContentDescription().charAt(1));
        bitmap = InGameActivity.currentBoardState[x][y].getPicture();
        width = bitmap.getWidth();
        height = bitmap.getHeight();
    }

    @Override
    protected void drawDragShadow(Canvas canvas) {
        Rect source = new Rect(0, 0, InGameActivity.chessSquareHeightWidth, InGameActivity.chessSquareHeightWidth);

        int w =  InGameActivity.chessSquareHeightWidth;
        int h = InGameActivity.chessSquareHeightWidth;

        canvas.translate(getDragX() - w / 2, getDragY() - h / 2);

        canvas.drawBitmap(bitmap, null, source, null);
    }
}

我希望这会有所帮助。

我认为实现这一目标的正确方法是:

/* Create the shadow from a view */
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
/* Access the view created and set the alpha of it to 1 (totally opaque)*/
shadowBuilder.getView().setAlpha(1);
/* Start dragging the object */
view.startDrag(data, shadowBuilder, view, 0);
编辑
它似乎在4.4及更高版本上不起作用:(

不知道是否有人知道它, 我们可以使用flag DRAG_flag_不透明来实现同样的效果, 因此,相应的ind startDrag方法如下所示:

    View.DragShadowBuilder dragShadowBuilder = new View.DragShadowBuilder(view);
    view.startDrag(clipData, dragShadowBuilder, view, DRAG_FLAG_OPAQUE);

这是不可能实现的。这就是
startdragandrop
创建要拖动的曲面的方式:

final SurfaceControl surfaceControl = new SurfaceControl.Builder(session)
            .setName("drag surface")
            .setParent(root.getSurfaceControl())
            .setBufferSize(shadowSize.x, shadowSize.y)
            .setFormat(PixelFormat.TRANSLUCENT)
            .setCallsite("View.startDragAndDrop")
            .build();

如您所见,格式设置为PixelFormat.TRANSLUCENT,并且没有选项更改此设置

您提供的第二个链接是否有不透明的阴影?我可以尝试一下,但也许您已经知道,第二个链接是错误的,现在我刚刚得到了您的希望:/。我编辑了我的回复。如果我给您我的onTouch代码,您能帮我输入吗请查看我的编辑,如果你需要任何其他信息,请毫不犹豫地问我你只是把任务委托给我吗?对不起,那不行。你应该自己做,但如果你遇到问题,我可以帮你。你的意思是你的视图是半透明的,但你想它的拖动阴影是不透明的吗?嗨,@Clay有您运行了演示?您好@Clay,我已经更新了演示,您需要再次下载它。您必须在活动布局xml中将
DragContainer
声明为根视图,并在
setContentView
之后获取引用。例如:
mDragContainer=(DragContainer)findViewById(R.id.root);
DragContainer
不是
DragShadowBuilder
。它是
视图组
,是原始活动视图的父视图。您可以通过gtalk与我联系。我如何在较低的api级别上实现此结果?是的,它正在工作
    View.DragShadowBuilder dragShadowBuilder = new View.DragShadowBuilder(view);
    view.startDrag(clipData, dragShadowBuilder, view, DRAG_FLAG_OPAQUE);
final SurfaceControl surfaceControl = new SurfaceControl.Builder(session)
            .setName("drag surface")
            .setParent(root.getSurfaceControl())
            .setBufferSize(shadowSize.x, shadowSize.y)
            .setFormat(PixelFormat.TRANSLUCENT)
            .setCallsite("View.startDragAndDrop")
            .build();