如果需要完全自定义的视图,则需要子类View(所有Android视图的超类),并提供自定义的sizing(onMeasure(...))和drawing(onDraw(...))方法:
创建您的自定义视图框架:每个自定义视图的基本相同。在这里,我们为自定义视图创建框架,该框架可以绘制一个笑脸,称为SmileyView:
public class SmileyView extends View {
private Paint mCirclePaint;
private Paint mEyeAndMouthPaint;
private float mCenterX;
private float mCenterY;
private float mRadius;
private RectF mArcBounds = new RectF();
public SmileyView(Context context) {
this(context, null, 0);
}
public SmileyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaints();
}
private void initPaints() {/* ... */}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {/* ... */}
@Override
protected void onDraw(Canvas canvas) {/* ... */}
}
初始化您的油漆:该Paint对象是你的虚拟画布的定义您的几何对象的渲染方式(如颜色,填充和中风风格等)刷。在这里,我们创建两个Paints,一个为圆形填充黄色,一个为眼睛和嘴巴绘制黑色描边:
private void initPaints() {
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setStyle(Paint.Style.FILL);
mCirclePaint.setColor(Color.YELLOW);
mEyeAndMouthPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mEyeAndMouthPaint.setStyle(Paint.Style.STROKE);
mEyeAndMouthPaint.setStrokeWidth(16 * getResources().getDisplayMetrics().density);
mEyeAndMouthPaint.setStrokeCap(Paint.Cap.ROUND);
mEyeAndMouthPaint.setColor(Color.BLACK);
}
实现您自己的onMeasure(...)方法:这是必需的,以便父布局(例如FrameLayout)可以正确对齐您的自定义视图。它提供了一套measureSpecs,可用于确定视图的高度和宽度。在这里,我们通过确保高度和宽度相同来创建一个正方形:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int w = MeasureSpec.getSize(widthMeasureSpec);
int h = MeasureSpec.getSize(heightMeasureSpec);
int size = Math.min(w, h);
setMeasuredDimension(size, size);
}
请注意,onMeasure(...)必须至少包含对的一个调用,setMeasuredDimension(..)否则您的自定义视图将以崩溃IllegalStateException。
实现自己的onSizeChanged(...)方法:这使您可以捕获自定义视图的当前高度和宽度,以正确调整渲染代码。在这里,我们只计算中心和半径:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mCenterX = w / 2f;
mCenterY = h / 2f;
mRadius = Math.min(w, h) / 2f;
}
实现自己的onDraw(...)方法:在这里实现视图的实际呈现。它提供了一个Canvas可以绘制的对象(Canvas有关所有可用绘制方法,请参见官方文档)。
@Override
protected void onDraw(Canvas canvas) {
// 画脸
canvas.drawCircle(mCenterX, mCenterY, mRadius, mCirclePaint);
// 吸引眼球
float eyeRadius = mRadius / 5f;
float eyeOffsetX = mRadius / 3f;
float eyeOffsetY = mRadius / 3f;
canvas.drawCircle(mCenterX - eyeOffsetX, mCenterY - eyeOffsetY, eyeRadius, mEyeAndMouthPaint);
canvas.drawCircle(mCenterX + eyeOffsetX, mCenterY - eyeOffsetY, eyeRadius, mEyeAndMouthPaint);
// mouth嘴
float mouthInset = mRadius /3f;
mArcBounds.set(mouthInset, mouthInset, mRadius * 2 - mouthInset, mRadius * 2 - mouthInset);
canvas.drawArc(mArcBounds, 45f, 90f, false, mEyeAndMouthPaint);
}
将自定义视图添加到布局:该自定义视图现在可以包含在您拥有的任何布局文件中。在这里,我们将其包装在内FrameLayout:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.app.SmileyView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
请注意,建议在查看代码完成后构建项目。如果不进行构建,您将无法在Android Studio的预览屏幕上查看视图。
将所有内容放在一起后,启动包含上述布局的活动后,应该会出现以下屏幕:
在,我有 所有的图片都已经提供,当用户点击一个按钮时,它必须以某种方式改变。 我在 我已经在as 其中被指定为(在
有人能帮我创建balow图像剪切搜索栏吗?我已经用自定义拇指和分段文本浏览过SeekBar,还有SeekBar拇指位置问题 但是我没有成功创建我的客户搜索栏,请帮助我
本文向大家介绍Android如何创建自定义ActionBar,包括了Android如何创建自定义ActionBar的使用技巧和注意事项,需要的朋友参考一下 当多个界面都有很多相似部分时,可以考虑创建一个功能较全的模板。而在需要时,可以通过引用模板来实现自己想要实现的功能。比如适配器 Adapter,当很多的适配器都差不多时,就可以通过打造一个通用的适配器来实现。本例中主要是如何创建自定义的 Act
我正在使用helm charts创建部署微服务,通过执行helm create创建包含部署、服务和入口的基本图表,但我没有其他配置,如水平pod自动缩放器、pod中断预算。
pre { white-space: pre-wrap; } 在不同的情况下,您可能需要为数据网格(datagrid)运用更灵活的布局。对于用户来说,卡片视图(Card View)是个不错的选择。这个工具可以在数据网格(datagrid)中迅速获取和显示数据。在数据网格(datagrid)的头部,您可以仅仅通过点击列的头部来排序数据。本教程将向您展示如何创建自定义卡片视图(Card View)。
我在Play商店中看到某些应用程序不像正常活动那样全屏。他们占据了一部分屏幕。我试图寻找解决方案,但由于我是新手,我不知道用于此类活动的确切单词。我如何创建此类活动?问候