diff options
author | Michael Jurka <mikejurka@google.com> | 2011-01-14 17:56:16 -0800 |
---|---|---|
committer | Michael Jurka <mikejurka@google.com> | 2011-01-14 17:56:16 -0800 |
commit | d63497bb62138dc70ef06d50133354c881c45d34 (patch) | |
tree | 8b44a849b8ca32cf187edb537811cd838346430c /src/com/android/launcher2/CachedTextView.java | |
parent | 381337be2249564b1d36717fc9bfdb7ec0b82bc3 (diff) | |
download | android_packages_apps_Trebuchet-d63497bb62138dc70ef06d50133354c881c45d34.tar.gz android_packages_apps_Trebuchet-d63497bb62138dc70ef06d50133354c881c45d34.tar.bz2 android_packages_apps_Trebuchet-d63497bb62138dc70ef06d50133354c881c45d34.zip |
fix build, adding missing file :(
Diffstat (limited to 'src/com/android/launcher2/CachedTextView.java')
-rw-r--r-- | src/com/android/launcher2/CachedTextView.java | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/com/android/launcher2/CachedTextView.java b/src/com/android/launcher2/CachedTextView.java new file mode 100644 index 000000000..eaa6636e6 --- /dev/null +++ b/src/com/android/launcher2/CachedTextView.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2010 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.launcher2; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Bitmap.Config; +import android.graphics.PorterDuff.Mode; +import android.text.Layout; +import android.util.AttributeSet; +import android.widget.TextView; + +/* + * This class is a bit of a hack, designed to speed up long text labels in Launcher. It caches the + * text in a TextView to a bitmap and then just draws that Bitmap instead afterward, speeding up + * rendering. Marquee scrolling is not currently supported. + * + */ +public class CachedTextView extends TextView { + private Bitmap mCache; + private final Paint mCachePaint = new Paint(); + private final Canvas mCacheCanvas = new Canvas(); + + private int mPrevAlpha = -1; + private boolean mIsBuildingCache; + boolean mIsTextCacheDirty; + float mTextCacheLeft; + float mTextCacheTop; + float mTextCacheScrollX; + float mRectLeft, mRectTop; + private float mPaddingH = 0; + private float mPaddingV = 0; + private CharSequence mText; + + public CachedTextView(Context context) { + super(context); + } + + public CachedTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CachedTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + protected int getCacheTopPadding() { + return 0; + } + protected int getCacheLeftPadding() { + return 0; + } + protected int getCacheRightPadding() { + return 0; + } + protected int getCacheBottomPadding() { + return 0; + } + + public void setText(CharSequence text, BufferType type) { + super.setText(text, type); + mIsTextCacheDirty = true; + } + + private void buildAndUpdateCache() { + final Layout layout = getLayout(); + final int left = getCompoundPaddingLeft(); + final int top = getExtendedPaddingTop(); + final float prevAlpha = getAlpha(); + + mTextCacheLeft = layout.getLineLeft(0) - getCacheLeftPadding(); + mTextCacheTop = top + layout.getLineTop(0) - mPaddingV - getCacheTopPadding(); + + mRectLeft = mScrollX + getLeft(); + mRectTop = 0; + mTextCacheScrollX = mScrollX; + + final float textCacheRight = + Math.min(left + layout.getLineRight(0) + mPaddingH, mScrollX + mRight - mLeft) + + getCacheRightPadding(); + final float textCacheBottom = top + layout.getLineBottom(0) + mPaddingV + + getCacheBottomPadding(); + final float xCharWidth = getPaint().measureText("x"); + + int width = (int) (textCacheRight - mTextCacheLeft + (2 * xCharWidth)); + int height = (int) (textCacheBottom - mTextCacheTop); + + if (width != 0 && height != 0) { + if (mCache != null) { + if (mCache.getWidth() != width || mCache.getHeight() != height) { + mCache.recycle(); + mCache = null; + } + } + if (mCache == null) { + mCache = Bitmap.createBitmap(width, height, Config.ARGB_8888); + mCacheCanvas.setBitmap(mCache); + } else { + mCacheCanvas.drawColor(0, Mode.CLEAR); + } + + mCacheCanvas.save(); + mCacheCanvas.translate(-mTextCacheLeft, -mTextCacheTop); + + mIsBuildingCache = true; + setAlpha(1.0f); + draw(mCacheCanvas); + setAlpha(prevAlpha); + mIsBuildingCache = false; + mCacheCanvas.restore(); + + // A hack-- we set the text to be one space (we don't make it empty just to avoid any + // potential issues with text measurement, like line height, etc.) so that the text view + // doesn't draw it anymore, since it's been cached. + mText = getText(); + setText(" "); + } + } + + public CharSequence getText() { + return (mText == null) ? super.getText() : mText; + } + + public void draw(Canvas canvas) { + if (mIsTextCacheDirty && !mIsBuildingCache) { + buildAndUpdateCache(); + mIsTextCacheDirty = false; + } + if (mCache != null && !mIsBuildingCache) { + canvas.drawBitmap(mCache, mTextCacheLeft - mTextCacheScrollX + mScrollX, + mTextCacheTop, mCachePaint); + } + super.draw(canvas); + } + + protected boolean isBuildingCache() { + return mIsBuildingCache; + } + + @Override + protected boolean onSetAlpha(int alpha) { + if (mPrevAlpha != alpha) { + mPrevAlpha = alpha; + mCachePaint.setAlpha(alpha); + super.onSetAlpha(alpha); + } + return true; + } +} |