让我来详细讲解一下“Android创建外部lib库及自定义View的图文教程”的完整攻略。
标准的库项目结构
要创建一个外部lib库,我们需要保证项目结构正确。一个典型的库项目结构如下:
library/
src/
main/
java/
com/yourpackage/library/
LibraryClass.java
res/
values/
attrs.xml
colors.xml
layout/
library_layout.xml
test/
java/
build.gradle
pom.xml (For Maven / Ivy)
LICENSE.txt
README.md
如上所示,除了src
和build.gradle
外,项目还包含license.txt
和readme.md
文件,以便其他开发者在使用时能够准确的知道适用协议和一些使用方法。pom.xml
文件是供Maven或Ivy构建系统使用的。
创建一个自定义View
接下来我们将创建一个自定义View。创建一个自定义View需要完成以下步骤:
1.创建一个继承自View的类,并重写一些它的方法
2.编写XML布局文件来使用这个自定义View
第一步:创建一个自定义View类
下面是一个创建自定义View类的代码示例:
public class MyCustomView extends View {
public MyCustomView(Context context) {
super(context);
}
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 实现测量逻辑
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 实现绘制逻辑
}
}
在上面的代码中,我们继承了View
类,并重写了onMeasure()
方法和onDraw()
方法。这两个方法分别负责测量和绘制我们需要展示的自定义View。
第二步:编写XML布局文件
编写XML布局文件和使用任何其他View一样,示例如下:
<com.example.mycustomview.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
第三步:在代码中使用自定义View
在代码中使用自定义View与使用其他View的方式一样,示例如下:
MyCustomView myCustomView = findViewById(R.id.my_custom_view);
在Android Studio中配置库项目
我们已经完成创建自定义View和布局文件的工作了。现在我们需要将其打包成一个外部库,以便在其他项目中进行使用。下面是打包的步骤:
1.在Android Studio中打开我们的自定义View项目。
2.打开“File->New->New Module”,选择“Android Library”,并填写相关信息。
3.在library模块的build.gradle文件中添加依赖项。通常情况下我们将添加依赖项的方式设置为“implementation”,如下所示:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}
完成上面三个步骤后,我们的自定义View项目就被打包成了一个库项目,以便在其他项目中进行使用。
示例
下面我们来看两个创建自定义View的实际示例:
示例1:创建一个自定义进度条
首先,我们创建一个新项目,然后在项目中创建一个自定义View类和布局文件。自定义View类的代码如下:
public class CustomProgressBar extends View {
private Paint mPaint;
private int mProgress = 0;
private boolean mIsAnimate = true;
public CustomProgressBar(Context context) {
super(context);
init();
}
public CustomProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setColor(Color.parseColor("#2aaae1"));
mPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
int progressWidth = (int) ((mProgress * 1.0f / 100) * width);
canvas.drawRect(0, 0, progressWidth, height, mPaint);
if (mIsAnimate) {
postDelayed(new Runnable() {
@Override
public void run() {
if (mProgress < 100) {
mProgress++;
invalidate();
}
}
}, 20);
}
}
}
代码中第26行的postDelayed()
方法可以不断地绘制矩形,并且每次绘制之前都将mProgress的值加1,从而实现进度条的功能。
创建XML文件布局的代码如下:
<com.example.customview.CustomProgressBar
android:id="@+id/progress_bar"
android:layout_width="200dp"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal" />
最后,我们在Activity中设置以上并播放动画即可。
示例2:创建一个自定义圆形进度条
这个例子将创建一个自定义圆形进度条。我们在布局文件中添加一个自定义View,然后在代码中绘制一个画圆的路径,并将其旋转以显示进度。
public class CircularProgressBar extends View {
private static final int MAX_PROGRESS = 100;
private int mProgress = 0;
private int mColor;
private int mBackgroundColor;
private int mStrokeWidth;
private Paint mPaint;
private boolean mAnimate;
public CircularProgressBar(Context context) {
this(context, null);
}
public CircularProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircularProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.CircularProgressBar, defStyleAttr, 0);
try {
mColor = a.getColor(R.styleable.CircularProgressBar_progressColor, Color.BLUE);
mBackgroundColor = a.getColor(
R.styleable.CircularProgressBar_backgroundColor, Color.GRAY);
mStrokeWidth = a.getDimensionPixelSize(
R.styleable.CircularProgressBar_strokeWidth, getResources().getDimensionPixelSize(R.dimen.default_stroke_width));
mAnimate = a.getBoolean(R.styleable.CircularProgressBar_animate, true);
} finally {
a.recycle();
}
init();
}
private void init() {
mPaint = new Paint();
mPaint.setColor(mColor);
mPaint.setStrokeWidth(mStrokeWidth);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
float radius = Math.min(width, height) / 2f - mStrokeWidth / 2f;
RectF rectF = new RectF(
width / 2f - radius,
height / 2f - radius,
width / 2f + radius,
height / 2f + radius);
canvas.drawCircle(width / 2f, height / 2f, radius, getBackgroundPaint());
canvas.drawArc(rectF, -90, 360 * mProgress / MAX_PROGRESS, false, mPaint);
if (mAnimate && mProgress < MAX_PROGRESS) {
mProgress++;
invalidate();
}
}
private Paint getBackgroundPaint() {
Paint paint = new Paint();
paint.setColor(mBackgroundColor);
paint.setStrokeWidth(mStrokeWidth);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
return paint;
}
}
在布局文件中添加代码如下:
<com.example.circularprogressbar.CircularProgressBar
android:id="@+id/circular_progress_bar"
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_gravity="center_horizontal"
app:progressColor="#FFC107"
app:backgroundColor="#E0E0E0"
app:strokeWidth="6dp"
app:animate="true" />
最后,我们在Activity中调用这两个自定义View即可。
以上就是如何在Android中创建外部lib库及自定义View的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android创建外部lib库及自定义View的图文教程 - Python技术站