大家。我有两个问题是我无法解决的。我制作了两个视频来帮助理解: (a)https://www.youtube.com/watch?v=TZG-wh6_69A
(b)https://youtu.be/3Wr9IOPihN0
这是我的第一个Android应用程序,所以我不知道我是否采取了正确的方式。
我有两种类型的对象可以进行更改:vector drawables(是xml文件)和在运行时绘制的一行。我不认为矢量drawables在这个问题上是错误的,只是行。这些元素是用这个XML夸大的视图:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/element_generic_root"
android:background="#0000ff">
<!--android:background="@android:color/transparent">-->
<!-- generic android:src just to show on xml preview. -->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/element_generic_image"
android:src="@drawable/pencil"
android:scaleType="fitXY" />
<ImageButton
android:layout_width="18dp"
android:layout_height="18dp"
android:id="@+id/element_generic_resize"
android:background="@drawable/button_resize"
android:layout_alignBottom="@+id/element_generic_image"
android:layout_toEndOf="@+id/element_generic_image"
android:layout_marginLeft="6dp"
android:adjustViewBounds="true"/>
<ImageButton
android:layout_width="18dp"
android:layout_height="18dp"
android:id="@+id/element_generic_rotate"
android:background="@drawable/rotate"
android:layout_alignTop="@+id/element_generic_image"
android:layout_toEndOf="@+id/element_generic_image"
android:layout_marginLeft="6dp"
android:adjustViewBounds="true"/>
</RelativeLayout>
在ImageView上,一切都发生了(绘制线条和矢量drawables)。 好的,现在我将解释第一个问题。
当调整矢量drawables的大小/旋转时,将(0,0)的枢轴固定没有问题。但是有线条,因为旋转时它更容易让用户看到相对于中间的旋转(见视频(a))。而且我这样做有问题,线元素在调整大小时会改变它的位置(我不知道为什么)。我的调整大小代码是:
public void resize() {
float scale = moveResize / DEFAULT_WIDTH;
float height = scale * DEFAULT_HEIGHT;
float nw = moveResize < MIN_WIDTH ? MIN_WIDTH : moveResize;
float nh = height < MIN_HEIGHT ? MIN_HEIGHT : height;
double rad = Math.toRadians(getView().getRotation());
double cos = Math.cos(rad);
double sin = Math.sin(rad);
double difh = (nh - getHeight()) * cos;
double difw = (nw - getWidth()) * sin;
setWidth(nw);
setHeight(nh);
if(nh == MIN_HEIGHT) difw = 0;
getView().setX((float) (getView().getX() + (difw / 2)));
getView().setY((float) (getView().getY() - (difh / 2)));
build();
}
我没有办法在元素的正确位置和drop事件上创建阴影,将元素准确地放在阴影所在的位置。这是我的影子代码:
public class ElementDragShadow extends View.DragShadowBuilder {
private int width;
private int height;
public ElementDragShadow(View view) {
super(view);
double rotationRad = Math.toRadians(getView().getRotation());
int w = (int) (getView().getWidth() * getView().getScaleX());
int h = (int) (getView().getHeight() * getView().getScaleY());
double s = Math.abs(Math.sin(rotationRad));
double c = Math.abs(Math.cos(rotationRad));
width = (int) (w * c + h * s);
height = (int) (w * s + h * c);
}
@Override
public void onDrawShadow(Canvas canvas) {
canvas.scale(getView().getScaleX(), getView().getScaleY(), width / 2, height / 2);
canvas.rotate(getView().getRotation(), width / 2, height / 2);
canvas.translate((width - getView().getWidth()) / 2, (height - getView().getHeight()) / 2);
super.onDrawShadow(canvas);
}
@Override
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
shadowSize.set(width, height);
shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
// shadowTouchPoint.set(shadowSize.x, shadowSize.y);
}
}
对于长篇文章感到抱歉,但我想尽可能地了解它。
提前致谢, AndréVendramini