Android TextView长影

Joh*_*ohn 8 java xml android textview

我从早上起就一直在尝试这个,但我无法让它发挥作用.

我想要做的是为TextView创建一个有点长的阴影,类似于以下内容:

http://www.iceflowstudios.com/v3/wp-content/uploads/2013/07/long_shadow_banner.jpg http://web3canvas.com/wp-content/uploads/2013/07/lsd-ps-action-720x400巴纽

到目前为止,我的解决方案是创建大量的TextView并将它们相互层叠,但如果我按照当前的方式使用它会有很多性能问题.

另一个解决方案是使用具有类似吸引力的自定义字体,但我找不到任何与我当前使用的字体相匹配的字体.

所以我想知道,是否可以使用:(我必须提一下,textview是动态创建的)

TV.setShadowLayer(1f, 5f, 5f, Color.GREY);
Run Code Online (Sandbox Code Playgroud)

要在一行中创建多个(作为级联图层),使阴影看起来很平滑?或者你们建议任何其他解决方案?

提前致谢.

Ole*_* K. 12

尝试使用光栅图像:

  1. 使用Paint.getTextBounds()方法检测文本的边界
  2. Bitmap使用此类指标创建透明(W + H) x H(您可以使用Bitmap.Config.ALPHA_8优化内存使用)
  3. 在此绘制文本Bitmap0x0位置
  4. 第一行复制Bitmap到原始宽度的新行,但高度为1px
  5. 遍历Y-axisBitmap(从顶部到底部),并绘制单行Bitmap与由对应的偏移量X-axis(你将透支一些透明的像素)
  6. 现在你拥有阴影的顶部
  7. 使用相同的技术绘制底部,但选择最后一行Bitmap

如果您检测到最后一行中的所有像素具有相同的颜色(完整阴影),则可以优化此算法.

更新1

我使用这个快速解决方案实现了这样的结

在此输入图像描述

MainActivity.java

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle state) {
        super.onCreate(state);

        LongShadowTextView longShadow = new LongShadowTextView(this);
        longShadow.setText("Hello World");
        setContentView(longShadow);
    }
}
Run Code Online (Sandbox Code Playgroud)

LongShadowTextView.java

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;

public class LongShadowTextView extends View {
    private Bitmap mBitmap;
    private String mText;

    public LongShadowTextView(Context context) {
        super(context);
    }

    public void setText(String text) {
        Paint paint = new Paint();
        // TODO provide setters for these values
        paint.setColor(Color.BLACK);
        paint.setTextSize(142);

        Rect rect = new Rect();
        paint.getTextBounds(text, 0, text.length(), rect);

        Bitmap bitmap = Bitmap.createBitmap(rect.width() + rect.height(), rect.height(), Bitmap.Config.ALPHA_8);
        Canvas canvas = new Canvas(bitmap);

        canvas.drawText(text, 0, rect.height(), paint);

        Rect src = new Rect();
        RectF dst = new RectF();

        int w = bitmap.getWidth();
        int h = bitmap.getHeight();

        src.left = 0;
        src.right = w;

        for (int i = 0; i < h; ++i) {
            src.top = i;
            src.bottom = i + 1;

            dst.left = 1;
            dst.top = i + 1;
            dst.right = 1 + w;
            dst.bottom = i + 2;

            canvas.drawBitmap(bitmap, src, dst, null);
        }

        mText = text;
        mBitmap = bitmap;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 0, 0, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新2

这是我取得的最终结果.从github 克隆这个演示.

在此输入图像描述

  • 嘿,我完全解决了你的任务!查看此演示:https://github.com/shamanland/longshadowtextview (2认同)