1529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy/* 2529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * Copyright (C) 2010 The Android Open Source Project 3529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * 4529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * you may not use this file except in compliance with the License. 6529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * You may obtain a copy of the License at 7529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * 8529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * 10529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * Unless required by applicable law or agreed to in writing, software 11529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * See the License for the specific language governing permissions and 14529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy * limitations under the License. 15529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy */ 16529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 17f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui; 18529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 19ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyimport android.animation.ObjectAnimator; 20529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.app.Activity; 21529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.content.Context; 22529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.graphics.Bitmap; 23529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.graphics.BitmapFactory; 24529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.graphics.BitmapShader; 25529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.graphics.Canvas; 26529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.graphics.Paint; 277230a74e9a36dfc6c4346c14e325bf07cd05b380Romain Guyimport android.graphics.drawable.ColorDrawable; 28529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.os.Bundle; 29529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport android.view.View; 30529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 31529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy@SuppressWarnings({"UnusedDeclaration"}) 32529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guypublic class LinesActivity extends Activity { 33ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy private ObjectAnimator mAnimator; 34ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 35529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy @Override 36529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy protected void onCreate(Bundle savedInstanceState) { 37529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy super.onCreate(savedInstanceState); 387230a74e9a36dfc6c4346c14e325bf07cd05b380Romain Guy getWindow().setBackgroundDrawable(new ColorDrawable(0xffffffff)); 39529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy final LinesView view = new LinesView(this); 40529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy setContentView(view); 41ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 42ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mAnimator = ObjectAnimator.ofFloat(view, "offset", 0.0f, 15.0f); 43ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mAnimator.setDuration(1500); 44ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mAnimator.setRepeatCount(ObjectAnimator.INFINITE); 45ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mAnimator.setRepeatMode(ObjectAnimator.REVERSE); 46ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mAnimator.start(); 47ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 48ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 49ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy @Override 50ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy protected void onDestroy() { 51ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy super.onDestroy(); 52ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mAnimator.cancel(); 53529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy } 54529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 5563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet public static class LinesView extends View { 565b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase private static final boolean LINE_AA = true; 57a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 58529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final Bitmap mBitmap1; 59529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final Paint mSmallPaint; 60529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final Paint mMediumPaint; 61529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final Paint mLargePaint; 62529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final BitmapShader mShader; 63529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final float[] mPoints; 64529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy private final Paint mAlphaPaint; 65a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy private final Paint mHairLinePaint; 66529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 67ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy private float mOffset; 68ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 6963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet public LinesView(Context c) { 70529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy super(c); 71529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 72529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1); 73529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 74529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mSmallPaint = new Paint(); 75a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mSmallPaint.setAntiAlias(LINE_AA); 76529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mSmallPaint.setColor(0xffff0000); 77529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mSmallPaint.setStrokeWidth(1.0f); 78529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 79529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mMediumPaint = new Paint(); 80a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mMediumPaint.setAntiAlias(LINE_AA); 81529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mMediumPaint.setColor(0xff0000ff); 82529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mMediumPaint.setStrokeWidth(4.0f); 83529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 84529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mLargePaint = new Paint(); 85a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mLargePaint.setAntiAlias(LINE_AA); 86529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mLargePaint.setColor(0xff00ff00); 87529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mLargePaint.setStrokeWidth(15.0f); 88529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 89529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mAlphaPaint = new Paint(); 90a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mAlphaPaint.setAntiAlias(LINE_AA); 91529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mAlphaPaint.setColor(0x7fff0050); 92529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mAlphaPaint.setStrokeWidth(10.0f); 9363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 94a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mHairLinePaint = new Paint(); 95a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mHairLinePaint.setAntiAlias(LINE_AA); 96a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mHairLinePaint.setColor(0xff0000ff); 97a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mHairLinePaint.setStrokeWidth(0.0f); 98a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy 99529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mShader = new BitmapShader(mBitmap1, BitmapShader.TileMode.MIRROR, 100529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy BitmapShader.TileMode.MIRROR); 101529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 102529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mPoints = new float[] { 103529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 62.0f, 0.0f, 302.0f, 400.0f, 104529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 302.0f, 400.0f, 352.0f, 400.0f, 105529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 352.0f, 400.0f, 352.0f, 500.0f 106529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy }; 107529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy } 108ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 109ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy public void setOffset(float offset) { 110ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy mOffset = offset; 111ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy invalidate(); 112ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 113529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 114529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy @Override 115529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy protected void onDraw(Canvas canvas) { 116529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy super.onDraw(canvas); 117ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 118529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.save(); 119529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.translate(100.0f, 20.0f); 120529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 121529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.drawLine(0.0f, 0.0f, 40.0f, 400.0f, mSmallPaint); 122529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.drawLine(5.0f, 0.0f, 95.0f, 400.0f, mMediumPaint); 123529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.drawLine(22.0f, 0.0f, 162.0f, 400.0f, mLargePaint); 12463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 125529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mLargePaint.setShader(mShader); 126529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.drawLine(42.0f, 0.0f, 222.0f, 400.0f, mLargePaint); 127ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy for (int x = 0; x < 20; x++) { 128ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy for (int y = 0; y < 20; y++) { 129ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy canvas.drawPoint(500.0f + x * (15.0f + mOffset), 130ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy y * (15.0f + mOffset), mLargePaint); 131ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 132ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 133529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mLargePaint.setShader(null); 13463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 135529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.drawLines(mPoints, mAlphaPaint); 136759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy 137759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy mSmallPaint.setAntiAlias(false); 138759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy canvas.drawLine(0.0f, 0.0f, 400.0f, 0.0f, mSmallPaint); 139a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy mSmallPaint.setAntiAlias(LINE_AA); 140469b1dbeaf7d3267d1b43af4e7391b49eac10ee0Romain Guy canvas.drawLine(0.0f, 0.0f, 0.0f, 400.0f, mSmallPaint); 141469b1dbeaf7d3267d1b43af4e7391b49eac10ee0Romain Guy canvas.drawLine(0.0f, 400.0f, 400.0f, 400.0f, mSmallPaint); 14263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 143529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.translate(120.0f, 0.0f); 14463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mAlphaPaint.setShader(mShader); 145529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.drawLines(mPoints, mAlphaPaint); 146529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy mAlphaPaint.setShader(null); 147529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 148529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy canvas.restore(); 14963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 150ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy canvas.save(); 151a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy canvas.scale(10.0f, 10.0f); 152a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy canvas.drawLine(50.0f, 40.0f, 10.0f, 40.0f, mSmallPaint); 15399ecdc480dd4f9b550b2a62ea39f77845a4fec49Chet Haase canvas.drawLine(10.0f, 45.0f, 20.0f, 55.0f, mSmallPaint); 154a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy canvas.drawLine(10.0f, 60.0f, 50.0f, 60.0f, mHairLinePaint); 155a957eea78557cb47a91d44d9e6ee641c58cf1c07Romain Guy canvas.restore(); 15675040f8a7727f18bb33da23696a32a0760926ff2Chris Craik 15775040f8a7727f18bb33da23696a32a0760926ff2Chris Craik canvas.save(); 15875040f8a7727f18bb33da23696a32a0760926ff2Chris Craik canvas.scale(10.0f, 50.0f); 15975040f8a7727f18bb33da23696a32a0760926ff2Chris Craik mSmallPaint.setStrokeWidth(0.0f); 16075040f8a7727f18bb33da23696a32a0760926ff2Chris Craik canvas.drawLine(20.0f, 9.0f, 30.0f, 11.0f, mSmallPaint); 16175040f8a7727f18bb33da23696a32a0760926ff2Chris Craik mSmallPaint.setStrokeWidth(1.0f); 16275040f8a7727f18bb33da23696a32a0760926ff2Chris Craik canvas.drawLine(30.0f, 9.0f, 40.0f, 11.0f, mSmallPaint); 16375040f8a7727f18bb33da23696a32a0760926ff2Chris Craik canvas.restore(); 164529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy } 165529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy } 166529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy} 167