Search code examples
androidandroid-canvastextview

Android Programmatically Stroke


I want to draw a black stroke on my text in Android.

I have seen this example: How do you draw text with a border on a MapView in Android?

Where the solution overrides onDraw() to create the stroke.

The problem is, I'm still relatively starting out in Android, and I have no idea how to transition to using that solution.

In my onCreate I set the text typeface (it's custom):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeatures();

    // Set content view and component listeners
    setContentView(R.layout.meme_maker);
    setListeners();

    context = this;

    Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Impact.ttf");
    TextView mmt = (TextView) findViewById(R.id.meme_maker_title);
    TextView ttc = (TextView) findViewById(R.id.top_text_canvas);
    TextView tbc = (TextView) findViewById(R.id.bottom_text_canvas);

    ttc.setTypeface(tf);
    tbc.setTypeface(tf);
    mmt.setTypeface(tf);
}

And I have an onClickListener where I change the text content of the TextView, based on the user writing the text he/she wants in a TextEntry and clicking a button afterwards.

ImageView ii = (ImageView) findViewById(R.id.insert_image);
    ii.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText tt = (EditText) findViewById(R.id.top_text_text);
            EditText bt = (EditText) findViewById(R.id.bottom_text_text);

            TextView ttc = (TextView) findViewById(R.id.top_text_canvas);
            TextView btc = (TextView) findViewById(R.id.bottom_text_canvas);

            ttc.setText(tt.getText().toString().toUpperCase());
            btc.setText(bt.getText().toString().toUpperCase());
        }
    });

It's pretty straightforward so far. My question is: how to insert the stroke of the text? Where? Do I need to create a Canvas and Paint objects?


Solution

  • The simplest way to get a shadow for text rendered in a TextView is to set up a style as described in this answer. That requires very little work and sounds like it will work fine in your situation.

    Using the technique you link to involves extending an existing View class, overriding onDraw(), and using Canvas.drawText() on the canvas passed to onDraw() to render the text yourself. That can be exactly what you need in some situations, but sounds like overkill for your current situation. If you want to look into it further, the Android dev guide on the subject is a good read.