FileDocCategorySizeDatePackage
ProjectionActivity.javaAPI DocAndroid 5.1 API2839Thu Mar 12 22:22:44 GMT 2015com.android.test.hwui

ProjectionActivity.java

package com.android.test.hwui;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;

import android.app.Activity;
import android.util.AttributeSet;
import android.view.RenderNode;
import android.view.View;
import android.widget.LinearLayout;

public class ProjectionActivity extends Activity {
    /**
     * The content from this view should be projected in between the background of the
     * ProjecteeLayout and its children, unclipped.
     *
     * This view doesn't clip to its bounds (because its parent has clipChildren=false) so that
     * when it is projected onto the ProjecteeLayout, it draws outside its view bounds.
     */
    public static class ProjectedView extends View {
        private final Paint mPaint = new Paint();
        private final RectF mRectF = new RectF();

        public ProjectedView(Context context) {
            this(context, null);
        }

        public ProjectedView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }

        public ProjectedView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);

            setOnClickListener(new OnClickListener() {
                boolean toggle = false;
                @Override
                public void onClick(View v) {
                    toggle = !toggle;
                    setProject(toggle);
                }
            });
        }

        private void setProject(boolean value) {
            RenderNode displayList = getDisplayList();
            if (displayList != null) {
                displayList.setProjectBackwards(value);
            }
            // NOTE: we can't invalidate ProjectedView for the redraw because:
            // 1) the view won't preserve displayList properties that it doesn't know about
            // 2) the damage rect won't be big enough

            // instead, twiddle properties on the container, so that enough area of the screen is
            // redrawn without rerecording any DisplayLists.
            container.setTranslationX(100f);
            container.setTranslationX(0.0f);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO: set projection flag
            final int w = getWidth();
            final int h = getHeight();
            mRectF.set(0, -h, w, 2 * h);
            mPaint.setAntiAlias(true);
            mPaint.setColor(0x5f00ff00);
            canvas.drawOval(mRectF, mPaint);
        }
    }

    static View container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.projection);
        container = findViewById(R.id.container);
    }
}