Android“拖放阴影”和一个视图位置,缩放和旋转

时间:2016-08-03 23:32:57

标签: android android-layout android-imageview android-canvas android-view

大家。我有两个问题是我无法解决的。我制作了两个视频来帮助理解: (a)https://www.youtube.com/watch?v=TZG-wh6_69A

(b)https://youtu.be/3Wr9IOPihN0

这是我的第一个Android应用程序,所以我不知道我是否采取了正确的方式。

  1. 查看比例并旋转(绘制线条和曲线)。
  2. 我有两种类型的对象可以进行更改: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();
        }
    
    1. 拖动阴影生成器
    2. 我没有办法在元素的正确位置和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

0 个答案:

没有答案