Hi,
This is actually normal. Scaling fonts does not necessarily lead to a linear
effect. Based on the font size, the text renderer can (and will) change the
spacing, the antialiasing, etc. to improve on readability. If you want to
scale text linearly you should turn the text into a bitmap first. If your
animation is implemented using Views, you can simply enabled the drawing
cache of the animated view.

On Mon, Jun 22, 2009 at 8:46 AM, sleith <raysle...@gmail.com> wrote:

>
> hi, i'm trying to animate text, but strange behavior happened when i
> tried to rotate and scale.
> When rotating, the text width becoming wider and narrower randomly
> When scaling, the text y position is going upper.
> i've test with image, but image works perfectly. don't know why text
> is not.
> Here's my code, please take a look or run it (only one file is enough
> to run the demo)
> thanks
>
> public class TestDraw extends Activity {
>        /** Called when the activity is first created. */
>        @Override
>        public void onCreate(Bundle savedInstanceState) {
>                super.onCreate(savedInstanceState);
>
>                FrameLayout flContent = new FrameLayout(this);
>                flContent.setLayoutParams(new
> LayoutParams(LayoutParams.FILL_PARENT,
>                                LayoutParams.FILL_PARENT));
>                setContentView(flContent);
>
>                SurfaceView svPreviewer = new SurfaceDrawer(this);
>                svPreviewer.setLayoutParams(new LayoutParams
> (LayoutParams.FILL_PARENT,
>                                LayoutParams.FILL_PARENT));
>
>                flContent.addView(svPreviewer);
>        }
>
>        private class SurfaceDrawer extends SurfaceView implements
>                        SurfaceHolder.Callback, Runnable {
>
>                private SurfaceHolder mSurfaceHolder;
>                private int mLayoutWidth;
>                private int mLayoutHeight;
>
>                private String mText = "Hello World! Hello Android!";
>                private Paint mFontPaint = new Paint();
>                private Paint mBackgroundPaint = new Paint();
>                private Rect mBackgroundRect = new Rect();
>
>                // thread
>                private Thread mThread;
>                private boolean mIsStopped = false;
>                private boolean mIsRunningMode = false;
>                private Lock mLock = new ReentrantLock();
>                private Condition mCond = mLock.newCondition();
>
>                public SurfaceDrawer(Context context) {
>                        super(context);
>                        mSurfaceHolder = getHolder();
>                        mSurfaceHolder.addCallback(this);
>
>                        mFontPaint.setColor(Color.WHITE);
>                        mBackgroundPaint.setColor(Color.MAGENTA);
>
>                        // set the rect for background
>                        mFontPaint.getTextBounds(mText, 0, mText.length(),
> mBackgroundRect);
>
>                        mThread = new Thread(this);
>                        mThread.start();
>                }
>
>                public void surfaceChanged(SurfaceHolder holder, int format,
> int
> width,
>                                int height) {
>                        mLayoutWidth = width;
>                        mLayoutHeight = height;
>
>                        mLock.lock();
>                        mIsRunningMode = true;
>                        mCond.signal();
>                        mLock.unlock();
>                }
>
>                public void surfaceCreated(SurfaceHolder holder) {
>                }
>
>                public void surfaceDestroyed(SurfaceHolder holder) {
>                        mLock.lock();
>                        mIsStopped = true;
>                        mIsRunningMode = false;
>                        mCond.signal();
>                        mLock.unlock();
>
>                        try {
>                                mThread.join();
>                        } catch (Exception e) {
>
>                        }
>                }
>
>                public void run() {
>                        while (mIsStopped == false) {
>                                mLock.lock();
>
>                                try {
>                                        while (mIsRunningMode == false) {
>                                                mCond.await();
>                                        }
>                                        if (mIsStopped == true) {
>                                                mLock.unlock();
>                                                break;
>                                        }
>
>                                        DrawRotationAnimation();
>                                        DrawScalingAnimation();
>
>                                } catch (InterruptedException e) {
>                                        e.printStackTrace();
>                                }
>
>                                mLock.unlock();
>                        }
>                }
>
>                public void DrawRotationAnimation() {
>                        Canvas c;
>                        int centerX = mLayoutWidth / 2;
>                        int centerY = mLayoutHeight / 2;
>                        for (int i = 0; i < 360; i += 20) {
>                                c = mSurfaceHolder.lockCanvas();
>                                c.save();
>
>                                c.rotate(i, centerX, centerY);
>                                c.translate(centerX -
> (mBackgroundRect.width() / 2), centerY
>                                                - (mBackgroundRect.height()
> / 2));
>
>                                c.drawColor(Color.BLACK);
>                                c.drawRect(mBackgroundRect,
> mBackgroundPaint);
>                                c.drawText(mText, 0, 0, mFontPaint);
>
>                                c.restore();
>                                mSurfaceHolder.unlockCanvasAndPost(c);
>                                SystemClock.sleep(300);
>                        }
>                }
>
>                public void DrawScalingAnimation() {
>                        Canvas c;
>                        int centerX = mLayoutWidth / 2;
>                        int centerY = mLayoutHeight / 2;
>                        for (float scale = 1; scale < 3; scale += 0.2) {
>                                c = mSurfaceHolder.lockCanvas();
>                                c.save();
>
>                                c.scale(scale, scale, centerX, centerY);
>                                c.translate(centerX -
> (mBackgroundRect.width() / 2), centerY
>                                                - (mBackgroundRect.height()
> / 2));
>
>                                c.drawColor(Color.BLACK);
>                                c.drawRect(mBackgroundRect,
> mBackgroundPaint);
>                                c.drawText(mText, 0, 0, mFontPaint);
>
>                                c.restore();
>                                mSurfaceHolder.unlockCanvasAndPost(c);
>                                SystemClock.sleep(300);
>                        }
>                }
>
>        }
> }
>
> >
>


-- 
Romain Guy
Android framework engineer
romain...@android.com

Note: please don't send private questions to me, as I don't have time to
provide private support.  All such questions should be posted on public
forums, where I and others can see and answer them

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to