0

私は zomato アプリでフィルターのようなものを実装しようとしています。フィルターを選択すると、最初の画面が移動し、最初の画面の一部のみが表示され、2 番目の画面全体が表示され、選択するとすべてのフィルターの種類を選択できます。最初の画面と 2 番目の画面の両方を移動した後のフィルターの種類。

私がやったことは、内側の画面 (フィルター タイプとフィルター オプション) を非表示の 2 つの相対的なレイアウトとして使用し、それらをスライドさせて、レイアウト パラメーターの余白を変更し、レイアウトを要求することで表示できるようにすることです。

3 番目の画面 (フィルター オプション) を表示している間、正しいマージンを指定しても 2 番目の画面は表示されません。

誰でも助けることができますか?

編集コード:

プライベート クラス SlidingAnimation extends Animation {

    private float mainViewStartX, mainViewEndX;
    private float sideViewFromX, sideViewToX;
    private float sideView2FromX,sideView2ToX;
    private View slideInView,slideOutView,slideInView2;


    public SlidingAnimation(float fromX, float toX, float sideViewFromX,
            float sideViewToX,float sideView2FromX,float sideView2ToX, int duration,View slideInView,View slideOutView,View slideInView2) {
        setDuration(duration);
        this.slideInView =  slideInView;
        this.slideOutView = slideOutView;
        this.slideInView2 = slideInView2;
        mainViewEndX = toX;
        mainViewStartX = fromX;
        slideOutViewLayoutParams = (LayoutParams) slideOutView.getLayoutParams();

        this.sideViewFromX = sideViewFromX;
        this.sideViewToX = sideViewToX;
        slideInViewLayoutParams = (LayoutParams) slideInView.getLayoutParams();     

        if(slideInView2!=null){
            Log.w(null,"Side View two also exists");
            this.sideView2FromX =  sideView2FromX ; 
            this.sideView2ToX =  sideView2ToX;
            slideInView2LayoutParams = (LayoutParams)slideInView2.getLayoutParams();
        }
    }

    @SuppressLint("NewApi")
    @Override
    protected void applyTransformation(float interpolatedTime,
            Transformation t) {
        super.applyTransformation(interpolatedTime, t);

        if (interpolatedTime < 1.0f) {
            // Applies a Smooth Transition that starts fast but ends slowly
            if(slideInView2==null){
                slideOutViewLayoutParams.rightMargin = (int) (mainViewStartX + ((mainViewEndX - mainViewStartX) * (Math
                        .pow(interpolatedTime - 1, 5) + 1)));               
                slideInViewLayoutParams.rightMargin = (int) (sideViewFromX - ((sideViewFromX-sideViewToX) * (Math
                        .pow(interpolatedTime - 1, 5) + 1)));
                slideOutViewLayoutParams.leftMargin = (int)- mainViewEndX;              
                slideInView.requestLayout();
                slideOutView.requestLayout();
                Log.w(null,"Slide Out Right Margin:"+slideOutViewLayoutParams.rightMargin);
                Log.w(null,"Slide Out Left Margin:"+slideOutViewLayoutParams.leftMargin);
                Log.w(null,"Slide In Left Margin:"+slideInViewLayoutParams.leftMargin);
            }
            else{
                slideOutViewLayoutParams.rightMargin = (int) (mainViewStartX + ((mainViewEndX - mainViewStartX) * (Math
                        .pow(interpolatedTime - 1, 5) + 1)));               
                slideInViewLayoutParams.rightMargin = (int) (sideViewFromX + ((sideViewToX-sideViewFromX) * (Math
                        .pow(interpolatedTime - 1, 5) + 1)));
                slideOutViewLayoutParams.leftMargin = (int)- mainViewEndX;      
                slideInViewLayoutParams.leftMargin = (int)-sideViewToX;
                slideInView2LayoutParams.rightMargin = (int) (sideView2FromX - ((sideView2FromX-sideView2ToX) * (Math
                        .pow(interpolatedTime - 1, 5) + 1)));                   
                slideOutView.requestLayout();
                slideInView.requestLayout();
                slideInView2.requestLayout();
                Log.w(null,"Slide Out Right Margin:"+slideOutViewLayoutParams.rightMargin);
                Log.w(null,"Slide Out Left Margin:"+slideOutViewLayoutParams.leftMargin);
                Log.w(null,"Slide In Left Margin:"+slideInViewLayoutParams.leftMargin);
                Log.w(null,"Slide In Right Margin:"+slideInViewLayoutParams.rightMargin);
                Log.w(null,"Slide In View 2 Right Margin:"+slideInView2LayoutParams.rightMargin);
            }
        }

    }
}

呼び出し :

SlidingAnimation open = new SlidingAnimation(-width+dpToPx(45), width - dpToPx(45/2), 0,width-dpToPx(45),-width+dpToPx(45),0,1000,filterTypeLayout, selectBusLayout,filterOptionLayout) ;

4

1 に答える 1

-1

2 つのHorizo ​​ntalScrollViews を使用してみてください。

HSV を FrameLayout に追加します。

HSV の OnTouchListeners を実装し、タッチ イベントを処理して、それに応じて HSV を画面上の特定の位置にスムーズにスクロールします。画面幅に基づいて位置を指定できます。

例: ScrollView.smoothScrollTo(4*幅/5, 0);

于 2012-11-16T06:09:46.503 に答える