29

How can you display upside down text with a textview in Android?

In my case I have a 2 player game, where they play across from each other. I want to display test to the second player oriented to them.


This was the solution I implemented after AaronMs advice

The class that does the overriding, bab.foo.UpsideDownText

package bab.foo;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;

public class UpsideDownText extends TextView {

    //The below two constructors appear to be required
    public UpsideDownText(Context context) {
        super(context);
    }

    public UpsideDownText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    @Override
    public void onDraw(Canvas canvas) {
        //This saves off the matrix that the canvas applies to draws, so it can be restored later. 
        canvas.save(); 

        //now we change the matrix
        //We need to rotate around the center of our text
        //Otherwise it rotates around the origin, and that's bad. 
        float py = this.getHeight()/2.0f;
        float px = this.getWidth()/2.0f;
        canvas.rotate(180, px, py); 

        //draw the text with the matrix applied. 
        super.onDraw(canvas); 

        //restore the old matrix. 
        canvas.restore(); 
    }
}

And this is my XML layout:

<bab.foo.UpsideDownText 
    android:text="Score: 0" 
    android:id="@+id/tvScore" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:textColor="#FFFFFF" 
    >
</bab.foo.UpsideDownText>
Ravedave
  • 1,158
  • 2
  • 11
  • 24

3 Answers3

31

in the xml file add:

android:rotation = "180"

in the respective element to display text upside down.

for example:

<TextView
       android:id="@+id/textView1"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:gravity="center"
       android:text="TextView" 
       android:rotation="180"/>
Alex Shesterov
  • 26,085
  • 12
  • 82
  • 103
Narayanan Ramanathan
  • 1,310
  • 10
  • 18
6

I haven't tried doing this myself, but I think it should work.

Override the view's onDraw method, call it's super passing in the canvas, then after call the rotate method on the canvas passed to it, passing in either 180 or Math.PI, depending on whether it works in degrees or radians.

AaronM
  • 1,577
  • 12
  • 15
  • 6
    You can just scale by -1 on the Y axis too :) – Romain Guy Apr 02 '10 at 03:04
  • Thanks I removed my comment asking for further help since that code didn't work :). Thanks for the answer it pointed me in the right direction. – Ravedave Apr 02 '10 at 04:39
  • @Romain Guy - Scaling by 0,-1,px,py causes the text to be flipped, like looking in a mirror. – Ravedave Apr 05 '11 at 04:01
  • Any Solution for [How to display Text in Android Canvas ShapeDrawable with RectShape or any Shape?](http://stackoverflow.com/questions/25401981/how-to-display-text-in-android-canvas-shapedrawable-with-rectshape) – LOG_TAG Aug 21 '14 at 05:25
3

the below code is working perfectly (thanks by the way). try to add the missing constructor. if it is not working my the problem is android version main is 2.1

package p.c;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewUD extends TextView {

    public TextViewUD(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public TextViewUD(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public TextViewUD(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();

        float py = this.getHeight()/2.0f;
        float px = this.getWidth()/2.0f;
        Log.d("testUD", String.format("w: %d h: %d ", this.getWidth(), this.getHeight()));
        Log.d("testUD", String.format("w: %f h: %f ", py, px));
        canvas.rotate(180, px, py);

        super.onDraw(canvas);

        canvas.restore();
    }
}
Onur Topal
  • 3,042
  • 1
  • 24
  • 41