Làm cách nào để mở rộng TextView
để cho phép vẽ văn bản có hiệu ứng gradient?Văn bản có độ dốc trong Android
Trả lời
Có vẻ như không thể mở rộng TextView để vẽ văn bản có độ dốc. Đó là, tuy nhiên, có thể đạt được hiệu ứng này bằng cách tạo ra một canvas và vẽ trên nó. Trước tiên, chúng ta cần phải declare our custom UI element. Trong quá trình bắt đầu, chúng ta cần tạo một lớp con của Layout. Trong trường hợp này, chúng tôi sẽ sử dụng BoringLayout chỉ hỗ trợ văn bản có một dòng.
Shader textShader=new LinearGradient(0, 0, 0, 20,
new int[]{bottom,top},
new float[]{0, 1}, TileMode.CLAMP);//Assumes bottom and top are colors defined above
textPaint.setTextSize(textSize);
textPaint.setShader(textShader);
BoringLayout.Metrics boringMetrics=BoringLayout.isBoring(text, textPaint);
boringLayout=new BoringLayout(text, textPaint, 0, Layout.Alignment.ALIGN_CENTER,
0.0f, 0.0f, boringMetrics, false);
Sau đó chúng tôi ghi đè onMeasure
và onDraw
:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
setMeasuredDimension((int) textPaint.measureText(text), (int) textPaint.getFontSpacing());
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
boringLayout.draw(canvas);
}
thực hiện của chúng tôi onDraw
là vào thời điểm này khá lười biếng (nó hoàn toàn bỏ qua các thông số kỹ thuật đo lường !, nhưng miễn là bạn đảm bảo rằng quan điểm là
Hoặc, có thể kế thừa từ một số Canvas
và ghi đè phương pháp onPaint
. Nếu điều này là d một, sau đó tiếc là các neo cho văn bản được rút ra sẽ luôn luôn được ở phía dưới vì vậy chúng tôi phải thêm -textPaint.getFontMetricsInt().ascent()
vào tọa độ y của chúng tôi.
Một giải pháp đơn giản nhưng phần nào hạn chế sẽ được sử dụng những thuộc tính này:
android:fadingEdge="horizontal"
android:scrollHorizontally="true"
Tôi đã sử dụng nó trên textfields nơi tôi muốn họ mờ dần nếu họ nhận được quá lâu.
Đó là một hack tốt đẹp. Tôi không cho rằng bạn có thể làm cho công việc đó theo chiều dọc? Không có bất kỳ tài sản android: scrollVertically nào xa như tôi có thể thấy – Casebash
Xin lỗi, tôi không biết cách làm điều đó: ( – pgsandstrom
TextView secondTextView = new TextView(this);
Shader textShader=new LinearGradient(0, 0, 0, 20,
new int[]{Color.GREEN,Color.BLUE},
new float[]{0, 1}, TileMode.CLAMP);
secondTextView.getPaint().setShader(textShader);
+1 để làm cho nó đơn giản và hiệu quả hơn. –
Cảm ơn một giải pháp rất đơn giản :) –
Trên thiết bị ICS của tôi, điều này dường như không hoạt động - - nó hoàn toàn trong suốt.Bất cứ ai khác nhìn thấy cùng một điều? Chế độ xem không được tăng tốc phần cứng. –
Tôi đã xây dựng một thư viện bao gồm cả hai phương pháp này. Bạn có thể tạo GradientTextView bằng XML hoặc chỉ sử dụng GradientTextView.setGradient (TextView textView ...) để làm điều đó trên một đối tượng TextView thông thường.
Dưới đây là một ví dụ cho LinearLayout, bạn có thể sử dụng ví dụ này cho TextView quá, và trong mã nguồn có wont có độ dốc mã hóa, bạn sẽ có được mã nguồn và thêm mã từ trang web đó bản thân - http://android-codes-examples.blogspot.com/2011/07/design-linearlayout-or-textview-and-any.html
đây là một cách tốt đẹp để làm điều đó:
/**
* sets a vertical gradient on the textView's paint, so that on its onDraw method, it will use it.
*
* @param viewAlreadyHasSize
* set to true only if the textView already has a size
*/
public static void setVerticalGradientOnTextView(final TextView tv, final int positionsAndColorsResId,
final boolean viewAlreadyHasSize) {
final String[] positionsAndColors = tv.getContext().getResources().getStringArray(positionsAndColorsResId);
final int[] colors = new int[positionsAndColors.length];
float[] positions = new float[positionsAndColors.length];
for (int i = 0; i < positionsAndColors.length; ++i) {
final String positionAndColors = positionsAndColors[i];
final int delimeterPos = positionAndColors.lastIndexOf(':');
if (delimeterPos == -1 || positions == null) {
positions = null;
colors[i] = Color.parseColor(positionAndColors);
} else {
positions[i] = Float.parseFloat(positionAndColors.substring(0, delimeterPos));
String colorStr = positionAndColors.substring(delimeterPos + 1);
if (colorStr.startsWith("0x"))
colorStr = '#' + colorStr.substring(2);
else if (!colorStr.startsWith("#"))
colorStr = '#' + colorStr;
colors[i] = Color.parseColor(colorStr);
}
}
setVerticalGradientOnTextView(tv, colors, positions, viewAlreadyHasSize);
}
/**
* sets a vertical gradient on the textView's paint, so that on its onDraw method, it will use it. <br/>
*
* @param colors
* the colors to use. at least one should exist.
* @param tv
* the textView to set the gradient on it
* @param positions
* where to put each color (fraction, max is 1). if null, colors are spread evenly .
* @param viewAlreadyHasSize
* set to true only if the textView already has a size
*/
public static void setVerticalGradientOnTextView(final TextView tv, final int[] colors, final float[] positions,
final boolean viewAlreadyHasSize) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
final TileMode tile_mode = TileMode.CLAMP;
final int height = tv.getHeight();
final LinearGradient lin_grad = new LinearGradient(0, 0, 0, height, colors, positions, tile_mode);
final Shader shader_gradient = lin_grad;
tv.getPaint().setShader(shader_gradient);
}
};
if (viewAlreadyHasSize)
runnable.run();
else
runJustBeforeBeingDrawn(tv, runnable);
}
public static void runJustBeforeBeingDrawn(final View view, final Runnable runnable) {
final OnPreDrawListener preDrawListener = new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
view.getViewTreeObserver().removeOnPreDrawListener(this);
runnable.run();
return true;
}
};
view.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
}
Ngoài ra, nếu bạn muốn sử dụng một bitmap của gradient, thay vào đó hoặc một thực tế, sử dụng:
/**
* sets an image for the textView <br/>
* NOTE: this function must be called after you have the view have its height figured out <br/>
*/
public static void setBitmapOnTextView(final TextView tv, final Bitmap bitmap) {
final TileMode tile_mode = TileMode.CLAMP;
final int height = tv.getHeight();
final int width = tv.getWidth();
final Bitmap temp = Bitmap.createScaledBitmap(bitmap, width, height, true);
final BitmapShader bitmapShader = new BitmapShader(temp, tile_mode, tile_mode);
tv.getPaint().setShader(bitmapShader);
}
Dưới đây là hỗ trợ nhiều dòng như một lớp lót. Điều này cũng làm việc cho các nút.
textView.getPaint().setShader(new LinearGradient(0,0,0,textView.getLineHeight(), startColor, endColor, Shader.TileMode.REPEAT));
đơn giản và hoạt động tuyệt vời !! –
Hoạt động, nhưng đối với chiều cao, bạn có thể muốn đưa vào các chữ cái tài khoản đi bên dưới dòng thực tế (như y, g, j, v.v.) và nhân dòng ánh sáng với 1.10f, ví dụ: 'textView.getLineHeight() * 1.10f'. –
- 1. Bộ chọn Android có hình nền và độ dốc
- 2. Cách áp dụng độ dốc CSS trên văn bản, từ màu trong suốt đến màu đục:
- 3. Độ dốc màu Javascript
- 4. Có thể sử dụng độ dốc trong email không?
- 5. Văn bản trong chế độ xem văn bản xuống trong Android 3.0
- 6. Chế độ xem văn bản không thể cuộn trong android
- 7. Lựa chọn văn bản Android Trong chế độ xem web
- 8. Hiển thị văn bản động trong chế độ xem Android
- 9. cách thêm đường viền vào văn bản trong chế độ xem văn bản android
- 10. Sử dụng nhiều màu văn bản trong chế độ xem văn bản của Android [Html.fromhtml()]
- 11. Android Thêm hình ảnh vào văn bản (trong chế độ xem văn bản)?
- 12. Độ dốc văn bản trình duyệt chéo trong css thuần túy mà không sử dụng hình nền
- 13. Tọa độ chạm trong chế độ xem văn bản
- 14. Đường dẫn/đường dẫn Raphael.js có độ dốc?
- 15. Chế độ xem cuộn cho chế độ xem văn bản trong android
- 16. Điền đường dẫn có độ dốc trên iOS
- 17. Độ dốc tuyến tính SVG không hoạt động trong Safari
- 18. Dự đoán tăng cường độ dốc trong môi trường sản xuất có độ trễ thấp?
- 19. Tối ưu hóa độ dốc gốc trong CUDA
- 20. Hoạt ảnh theo độ dốc SVG
- 21. Tính toán độ dốc với python
- 22. Viền và độ dốc của CSS
- 23. Android: cách đặt dấu đầu dòng, ngắt dòng vào văn bản trong chế độ xem văn bản
- 24. Độ tin cậy được tô bóng theo độ dốc
- 25. Làm cách nào để hiển thị văn bản lộn ngược với chế độ xem văn bản trong Android?
- 26. Thư viện cho cây tăng cường độ dốc
- 27. Tạo hình ảnh có văn bản tùy chỉnh trong Android
- 28. Giảm độ đệm văn bản bên trong Nút
- 29. Độ mờ bóng văn bản
- 30. thêm dòng dựa trên độ dốc và chặn trong matplotlib?
Xin chào, bạn có thể thêm một số mã khác vào câu trả lời này không? Cụ thể, phần còn lại của bố cục mở rộng BoringLayout cảm ơn! – ekatz
Tôi liên kết đến BoringLayout nên được bao gồm trong SDK – Casebash