在捏拉缩放上组合多个视图,并用不同的视图替换它们

时间:2014-05-05 19:05:15

标签: android android-layout scrollview android-canvas pinchzoom

我有一个Horizo​​ntalScrollView(parent)的子类,它管理着多个子视图。每个视图都包含一个矩形,下面几行和TextView(见图)。我在其中添加了捏缩放手势,因此当用户捏缩放时,根据比例因子缩放两个手指之间的所有子视图。所以例如我的第一根手指在三月份的一月和二指上,我正在进行捏合,所有三个视图(1月,2月和3月)都在缩放。我只在x方向缩放。我还定义了特定视图的最小和最大宽度。

现在我想扩展此功能。我想在其中包含某种层次特征。因此,如果特定层次结构中的所有视图都具有最小宽度,并且如果我尝试进一步缩小它们(通过缩放缩放),则所有这些视图必须由不同的视图替换。

例如,假设Jan,Feb和March处于一个层次结构中,通过缩放缩放我将它们缩小到最小宽度。如果我进一步尝试将其缩小,那么代替这三个视图会出现另一个视图。

这个功能的目的是说我在Horizo​​ntalScrollView中有10个月的月份。所以我总共有120次观看(10年* 12个月)。因此,如果我缩减一年中的所有月份并进一步尝试缩小它们,那么我应该用一年视图替换12个月的视图。

希望我的问题清楚。任何人都可以告诉我该怎么做。

编辑: 我将子视图的比例因子存储在数组状态[]中,并在我的代码中添加了两个方法

     boolean checkstate()
     {
         if(state[6]<=0.3f &&state[7]<=0.3f &&state[8]<=0.3f  )
             return true;
         else
             return false;
     }


    void changewithparent()
    {
        LinearLayout parent=(LinearLayout)takeparent();
        parent.removeViewAt(6);
        parent.removeViewAt(6);
        parent.removeViewAt(6);

        //parent.requestLayout();
        View v=kk.getView(6, null, parent);
        v.setBackgroundColor(Color.GREEN);
        parent.addView(v, 0);
     }

同样在ScaleListener中我添加了以下行

    //start and end are the indices of child views which are scaling
for(int i=start;i<=last;i++)
            {
                LinearLayout ll=(LinearLayout)pp.getChildAt(i);
                DrawView view=(DrawView)ll.findViewById(R.id.drawview);

                view.mScaleFactor=mScaleFactor;
                view.invalidate();
                state[i]=view.sf;   updating the scale factor in parent by taking the value from child view
                change= checkstate();
                if(change==true)
                    changewithparent();

            } 

但是,只要达到子视图的最小限制并且我尝试用父视图替换它们,我的应用程序就会崩溃

enter image description here

1 个答案:

答案 0 :(得分:0)

由于您根据月份的最小宽度知道年度视图的宽度,您是否可以将年度视图的可见性设置为GONE,然后根据需要交换月份和年份的可见性?

为了使它更具动感,你可以为每个存储它状态的视图设置一个对象,在这种情况下,它会包含一些信息,告诉你它是否处于最小或最大宽度。缩放时,您将检查每个对象的状态更改。如果状态检查通过了一些规则(例如,最小宽度为12个月的对象,或者高于最大宽度的10年对象),则会请求一个布局,然后用适当的新视图替换视图,并更新状态对象。