Масштабируемый TextView

  1. package com.annimon.widget;
  2.  
  3. public class ZoomingTextView extends TextView {
  4.  
  5.     private static final int DEFAULT_TEXT_SIZE = 18;
  6.     private static final int MINIMAL_TEXT_SIZE = 6, MAXIMAL_TEXT_SIZE = 50;
  7.     private static final float MIN_SCALE = MINIMAL_TEXT_SIZE / (float) DEFAULT_TEXT_SIZE;
  8.     private static final float MAX_SCALE = MAXIMAL_TEXT_SIZE / (float) DEFAULT_TEXT_SIZE;
  9.  
  10.     private ScaleGestureDetector scaleDetector;
  11.     private float scaleFactor;
  12.  
  13.     public ZoomingTextView(Context context) {
  14.         super(context);
  15.         init(context);
  16.     }
  17.  
  18.     public ZoomingTextView(Context context, AttributeSet attrs) {
  19.         super(context, attrs);
  20.         init(context);
  21.     }
  22.  
  23.     public ZoomingTextView(Context context, AttributeSet attrs, int defStyle) {
  24.         super(context, attrs, defStyle);
  25.         init(context);
  26.     }
  27.  
  28.     private void init(Context context) {
  29.         scaleDetector = new ScaleGestureDetector(context, new ScaleListener());
  30.         scaleFactor = 1.0f;
  31.     }
  32.  
  33.  
  34.     @Override
  35.     public boolean onTouchEvent(MotionEvent event) {
  36.         scaleDetector.onTouchEvent(event);
  37.         return super.onTouchEvent(event);
  38.     }
  39.  
  40.     private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
  41.  
  42.         @Override
  43.         public boolean onScale(ScaleGestureDetector detector) {
  44.             scaleFactor *= detector.getScaleFactor();
  45.             scaleFactor = Math.max(MIN_SCALE, Math.min(scaleFactor, MAX_SCALE));
  46.  
  47.             final int textSize = (int) (scaleFactor * DEFAULT_TEXT_SIZE);
  48.             setTextSize(textSize);
  49.  
  50.             return true;
  51.         }
  52.     }
  53. }
Данный виджет позволяет масштабировать текст в TextView. По такому же принципу можно сделать масштабируемым любой другой виджет.
В layout.xml заменить TextView на com.annimon.widget.ZoomingTextView, а в главный Layout дописать xmlns:app="http://schemas.android.com/apk/res-auto". Пример:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.              xmlns:app="http://schemas.android.com/apk/res-auto"
  4.              android:layout_width="fill_parent"
  5.              android:layout_height="fill_parent"
  6.              android:orientation="vertical" >
  7.  
  8.     <com.annimon.widget.ZoomingTextView
  9.        android:id="@+id/textView"
  10.        android:layout_width="fill_parent"
  11.        android:layout_height="wrap_content" />
  12.  
  13. </LinearLayout>

Реклама

Мы в соцсетях

tw tg yt gt