/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.test.hwui; import android.animation.ObjectAnimator; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; public class MovingSurfaceViewActivity extends Activity implements Callback { SurfaceView mSurfaceView; ObjectAnimator mAnimator; class MySurfaceView extends SurfaceView { boolean mSlow; boolean mScaled; int mToggle = 0; public MySurfaceView(Context context) { super(context); setOnClickListener(v -> { mToggle = (mToggle + 1) % 4; mSlow = (mToggle & 0x2) != 0; mScaled = (mToggle & 0x1) != 0; mSurfaceView.setScaleX(mScaled ? 1.6f : 1f); mSurfaceView.setScaleY(mScaled ? 0.8f : 1f); setTitle("Slow=" + mSlow + ", scaled=" + mScaled); invalidate(); }); setWillNotDraw(false); } @Override public void draw(Canvas canvas) { super.draw(canvas); if (mSlow) { try { Thread.sleep(16); } catch (InterruptedException e) {} } } public void setMyTranslationY(float ty) { setTranslationY(ty); if (mSlow) { invalidate(); } } public float getMyTranslationY() { return getTranslationY(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout content = new FrameLayout(this); mSurfaceView = new MySurfaceView(this); mSurfaceView.getHolder().addCallback(this); final float density = getResources().getDisplayMetrics().density; int size = (int) (200 * density); content.addView(mSurfaceView, new FrameLayout.LayoutParams( size, size, Gravity.CENTER_HORIZONTAL | Gravity.TOP)); mAnimator = ObjectAnimator.ofFloat(mSurfaceView, "myTranslationY", 0, size); mAnimator.setRepeatMode(ObjectAnimator.REVERSE); mAnimator.setRepeatCount(ObjectAnimator.INFINITE); mAnimator.setDuration(200); mAnimator.setInterpolator(new LinearInterpolator()); setContentView(content); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Canvas canvas = holder.lockCanvas(); canvas.drawColor(Color.WHITE); holder.unlockCanvasAndPost(canvas); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override protected void onResume() { super.onResume(); mAnimator.start(); } @Override protected void onPause() { mAnimator.pause(); super.onPause(); } }