我正在创建一个自定义View类,使用StaticLayout从.ttf资产文件加载的自定义字体显示文本.字体的基本外观是serif字体,字体文件中的TrueType属性表示它是serif.然而,对于不在字体中的字符,Android会回归到无衬线字体(它看起来像Roboto或Noto,具体取决于Android版本).
有没有办法控制这个,以便Android布局引擎回归serif字体?(就像可能会传递一些魔术字符串Paint#setFontFeatureSettings(),或者也许是指定一堆字体用于Paint?)
当应用程序分发时,任何解决方案都必须工作,因此使用Android系统配置文件玩游戏不是一种选择.此外,我知道这个问题(四年后仍然没有答案),但我的问题有点不同,尽管两个问题的解决方案可能完全相同.
我试图达到类似这个的效果:
我现在在做什么:
public MaskedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setTextSize(25);
p.setColor(Color.GREEN);
pReplace = new Paint(p);
pReplace.setColor(Color.BLUE);
pReplace.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
pMask = new Paint();
int lightGradientColor = getResources().getColor(R.color.dailyGoalLowLight);
int darkGradientColor = getResources().getColor(R.color.dailyGoalLowDark);
Shader shader = new LinearGradient(0, 0, 150, 0, lightGradientColor, darkGradientColor, Shader.TileMode.CLAMP);
pMask.setShader(shader);
pMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
if (!Utils.isEmpty(sText)) {
canvas.drawText(sText, 150, getHeight() / 2, p);
canvas.drawRect(0, 0, 180, getHeight(), pMask);
canvas.drawText(sText, 150, getHeight()/2, pReplace);
}
canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)
这导致: …
android android-custom-view porter-duff android-view android-paint
我在 Zeplin 有一个项目,并且有很多视图/布局
Shadows
outer
X 0dp Y 0dp
Blur 10dp Shadows 0dp
Color #000000
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在 Android 中实现这一点。如何blur在 Android 中指定阴影和颜色?Paint中的setShadowLayer是唯一的方法吗?大多数时候我没有绘制对象,尤其是对于 LinearLayout 来说。
android.graphics.Paint内存是重物吗?哪个更有效,将绘制对象引用传递给需要在画布上绘制并在这些类中设置绘制属性(例如颜色、样式等)的类,或者在需要的任何地方创建新的 Paint 对象?
我正在通过扩展创建自定义视图 android.view.View.
现在,我需要在低于 21 的 API 级别上绘制一个圆角矩形。Android 有一个内置的方法名称drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)in android.graphics.Canvas,但它不支持低于 21 的 API,但我需要在 API 16 上绘制它。我怎样才能做到这一点?
提前致谢
我正在开发绘图应用程序,用户可以在其中绘制矩形、圆形等形状。用户还可以徒手绘图(钢笔)。
我想添加撤消、重做功能。我已经搜索并阅读了大部分关于撤消和重做的答案,但所有内容都与路径相关。意味着他们正在管理两个列表,一个用于绘制路径列表,第二个用于撤消路径列表。这是一种很好的工作方式,但只有在手绘图或者我使用路径时才有效。
这里我为不同的形状调用不同类型的画布方法。
帮助我在画布绘图上提供撤消重做。
这是我的代码
public class DrawingView extends android.support.v7.widget.AppCompatImageView {
public static final int RECTANGLE = 1;
public static final int SQUARE = 2;
public static final int CIRCLE = 3;
public
static final int LINE = 4;
public static final int SMOOTH_LINE = 5;
public static final int TRIANGLE = 6;
public static final int IMPORT_IMAGE = 7;
public static final int ERASER = 8;
private static final float TOUCH_TOLERANCE = 5;
private int color;
private int currentShape; …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码来制作旋转轮。
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
for (int i = 0; i < segmentColors.length; i ++)
{
drawDataSet(canvas, i);
}
canvas.drawCircle(getWidth()/2, getHeight()/2, getWidth() - getWidth()/2 - dpToPx(5), mTransparentCirclePaint);
}
protected void drawDataSet(Canvas canvas, int position)
{
int color = segmentColors[position];
float mainArcAngle = ((float) 360/ (float)segmentColors.length);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
if ( position%2 == 0)
paint.setColor(color);
else
paint.setColor(Color.parseColor("#009f2f"));
RectF rect = new RectF(0, 0, getWidth(), getWidth());
canvas.drawArc(rect, (mainArcAngle * position), mainArcAngle, true, paint);
TextPaint mTextPaint = …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个待办事项列表应用程序.我将输入的文本添加到输入的listitems,它没有样式工作正常.使用paint添加样式并绘制其给出空指针异常后.我正在初始化"ToDoListItemView"的init方法中的所有绘图和绘制对象.我尝试使用"log.i",但它没有进入ToDoListItemView的init方法.
这是我的代码.
主要活动:
package todo.prac.com.todolist;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView mylistView=(ListView)findViewById(R.id.myListView);
final EditText editText=(EditText)findViewById(R.id.myEditText);
final ArrayList<String>todoItems=new ArrayList<String>();
final ArrayAdapter<String>adapter;
adapter=new ArrayAdapter<String>(this,R.layout.todolist_view,todoItems);
mylistView.setAdapter(adapter);
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(keyEvent.getAction()==KeyEvent.ACTION_DOWN){
if(i==KeyEvent.KEYCODE_ENTER){
todoItems.add(0,editText.getText().toString());
adapter.notifyDataSetChanged();
editText.setText("");
return true;
}
}
return false;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
和我的ToDoListItemView
package todo.prac.com.todolist;
import …Run Code Online (Sandbox Code Playgroud)