在创建片段时通过画布在imageview上绘制一条线

时间:2016-08-10 10:32:13

标签: canvas bitmap imageview fragment

目前我正在尝试使用Android Studio编写小型应用时解决问题。

我有一个主要活动,用于在我的代码中切换不同的碎片。现在我需要加载一个新的片段,如果我的设备的方向被切换(例如从肖像到风景)。我用方法

这样做
public void onConfigurationChanged(Configuration newConfig)

此时一切似乎都很好。

在我的第一个片段中,我有一个图像视图,它将被"透支"用一条画布线。由于新的方向片段需要具有相同大小的imageview(包含在XML_layout文件中)具有相同的行,我保存坐标,在切换到新的片段之前将它们从旧的Fragment类中取出,并尝试绘制再次使用该行的新imageview。画布线方法只是通过传递的角度(第一个属性)计算坐标。 另外,我在editText字段中显示坐标值。

现在我的问题是,在旋转设备之后,我将在editText字段中看到坐标但是我无法在新的片段中绘制我的ImageView,因为我用TextWatcher / afterTextChanged触发了该事件

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
          drawLineOne(50, Color.Green, MyImVi);  
        }
    });

并且Textwatcher位于

public void onViewCreated(View view, Bundle savedInstanceState)

我的新碎片。

Textwatcher的想法是每次在该editText中包含一个新角度后重新绘制该行。

现在,如果方向已经改变并且我的新角度有可处理的数据,我也尝试绘制该线(整个想法是在两个图像视图中都有一个比较线,景观模式和portraitmode)。

但是如果我试图在onViewCreated这样的另一个地方触发我的drawLineOne方法,那我就错了:

java.lang.IllegalArgumentException: width and height must be > 0

在为Canvas对象创建Bitmap文件时会发生这种情况:

Bitmap bmp = Bitmap.createBitmap(MyImVi.getWidth(), MyImVi.getHeight(), Bitmap.Config.ARGB_8888);

有没有办法调用或创建一个在更改方向后触发的功能,并且在我的活动中可以看到新的片段?我想这就是它发生的主要问题,我已经尝试过调用我的drawLineOne:

  • 在onStart()
  • 的onResume()
  • onActivityCreated()
  • 头部中的
  • onViewCreated()(在分配Textwatcher之前) 也喜欢那个

    @覆盖 public void setUserVisibleHint(boolean isVisibleToUser){     super.setUserVisibleHint(isVisibleToUser);     如果(isVisibleToUser){         if(interimValueAzimut!= null){             drawLineOne(50,Color.GREEN,imageViewAzimut_ls);         }     } }

或者旋转后是否有更简单的方法来绘制该线?也许用我的TextWatcher的另一种方法?

我刚刚开始使用Java并且使用它变得更好但是总是遇到这样的问题所以请温柔一点:)

亲切的问候

1 个答案:

答案 0 :(得分:0)

好吧,我通过检查更多stackoverflow Q& A线程设法解决了我的问题。 我刚拿了一个TreeObserver.OnGlobalLayoutListener。

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
        }
    });

无论如何,已经解决了:)