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