当前位置: 首页 > news >正文

自定义View实例

文章目录

      • 1. 创建自定义View - `WaveProgressView`
      • 2. 在 `MainActivity` 中使用 `WaveProgressView`
      • 3. `activity_main.xml` 布局文件
      • 4. 创建 `NextActivity`
      • 5. `AndroidManifest.xml` 中的声明
  • 分割线

1. 创建自定义View - WaveProgressView

首先,我们创建一个自定义的 WaveProgressView,它包含一个圆形水波浪效果和进度百分比的显示。

package com.example.waveprogress;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;public class WaveProgressView extends View {private Paint circlePaint;private Paint wavePaint;private Paint textPaint;private Path wavePath;private int progress = 0; // 进度从0到100public WaveProgressView(Context context) {super(context);init();}public WaveProgressView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {circlePaint = new Paint();circlePaint.setColor(Color.BLUE);circlePaint.setStyle(Paint.Style.STROKE);circlePaint.setStrokeWidth(10);circlePaint.setAntiAlias(true);wavePaint = new Paint();wavePaint.setColor(Color.CYAN);wavePaint.setStyle(Paint.Style.FILL);wavePaint.setAntiAlias(true);textPaint = new Paint();textPaint.setColor(Color.WHITE);textPaint.setTextSize(50);textPaint.setAntiAlias(true);textPaint.setTextAlign(Paint.Align.CENTER);wavePath = new Path();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);int width = getWidth();int height = getHeight();int radius = Math.min(width, height) / 2 - 20;// 绘制圆形边框canvas.drawCircle(width / 2, height / 2, radius, circlePaint);// 绘制水波浪效果wavePath.reset();float waveHeight = (1 - progress / 100f) * (2 * radius); // 水波位置wavePath.moveTo(0, waveHeight);for (int i = 0; i < width; i += 20) {wavePath.lineTo(i, (float) (waveHeight + Math.sin(i / (float) width * 2 * Math.PI) * 20));}wavePath.lineTo(width, height);wavePath.lineTo(0, height);wavePath.close();canvas.drawPath(wavePath, wavePaint);// 绘制进度百分比文字String progressText = progress + "%";canvas.drawText(progressText, width / 2, height / 2 + textPaint.getTextSize() / 4, textPaint);}// 设置进度public void setProgress(int progress) {this.progress = progress;invalidate();}public int getProgress() {return progress;}
}

2. 在 MainActivity 中使用 WaveProgressView

接下来,我们在 MainActivity 中使用这个自定义控件,并设置当进度达到100%时跳转到下一个Activity。

package com.example.waveprogress;import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private WaveProgressView waveProgressView;private Handler handler = new Handler();private int progress = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);waveProgressView = findViewById(R.id.waveProgressView);// 模拟进度增加handler.postDelayed(new Runnable() {@Overridepublic void run() {if (progress <= 100) {waveProgressView.setProgress(progress);progress += 5;handler.postDelayed(this, 200);} else {// 当进度达到100%时跳转到下一个ActivityIntent intent = new Intent(MainActivity.this, NextActivity.class);startActivity(intent);finish();}}}, 200);}
}

3. activity_main.xml 布局文件

res/layout/activity_main.xml 中添加自定义控件的布局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.example.waveprogress.WaveProgressViewandroid:id="@+id/waveProgressView"android:layout_width="200dp"android:layout_height="200dp"android:layout_centerInParent="true" />
</RelativeLayout>

4. 创建 NextActivity

最后,我们创建一个新的 NextActivity,这是进度达到100%后跳转到的目标Activity。

package com.example.waveprogress;import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;public class NextActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_next);}
}

5. AndroidManifest.xml 中的声明

不要忘记在 AndroidManifest.xml 中声明新的Activity。

<activity android:name=".NextActivity"></activity>

这样就完成了一个自定义的圆形水波浪进度框,随着进度的增加,水波浪也会上升,并显示相应的百分比。当进度达到100%时,跳转到另一个Activity。

分割线

  1. 自定义View实现:
public class CircularProgressView extends View {private Paint circlePaint, progressPaint, textPaint;private int progress = 0;private int maxProgress = 100;private int circleRadius = 100;private int centerX, centerY;private int progressColor = Color.BLUE;private int circleColor = Color.GRAY;private int textColor = Color.BLACK;public CircularProgressView(Context context) {super(context);init();}public CircularProgressView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}private void init() {circlePaint = new Paint();circlePaint.setColor(circleColor);circlePaint.setStyle(Paint.Style.FILL);progressPaint = new Paint();progressPaint.setColor(progressColor);progressPaint.setStyle(Paint.Style.FILL);textPaint = new Paint();textPaint.setColor(textColor);textPaint.setTextSize(50);textPaint.setTextAlign(Paint.Align.CENTER);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);centerX = w / 2;centerY = h / 2;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制圆形背景canvas.drawCircle(centerX, centerY, circleRadius, circlePaint);// 绘制进度条RectF rectF = new RectF(centerX - circleRadius, centerY - circleRadius,centerX + circleRadius, centerY + circleRadius);canvas.drawArc(rectF, -90, (float) progress / maxProgress * 360, true, progressPaint);// 绘制百分比文本String text = progress + "%";canvas.drawText(text, centerX, centerY + (textPaint.descent() + textPaint.ascent()) / 2, textPaint);}public void setProgress(int progress) {this.progress = progress;invalidate();}
}
  1. 在MainActivity中使用并实现跳转:
public class MainActivity extends AppCompatActivity {private CircularProgressView progressView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);progressView = findViewById(R.id.progress_view);// 模拟进度增加new Thread(() -> {for (int i = 0; i <= 100; i++) {int finalI = i;runOnUiThread(() -> progressView.setProgress(finalI));try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}if (finalI == 100) {// 进度达到100%,跳转到下一个ActivitystartActivity(new Intent(MainActivity.this, NextActivity.class));}}}).start();}
}

在activity_main.xml中添加CircularProgressView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><com.example.customview.CircularProgressViewandroid:id="@+id/progress_view"android:layout_width="300dp"android:layout_height="300dp" /></LinearLayout>

这样就实现了一个圆形进度条,当进度达到100%时会自动跳转到下一个Activity。您可以根据需要自定义进度条的样式和颜色。


http://www.mrgr.cn/news/3879.html

相关文章:

  • XSS的一些相关案例及DOM破坏的案例
  • 最新动态鲨鱼导航网引导页html源码
  • C++:模板 II(非类型模板参数,特化,分离编译)
  • Google 开发者大会东南亚制胜攻略分享
  • 5.9.9 串级PID控制器
  • SQL基础——SQL分类
  • 【赵渝强老师】Spark中的RDD
  • 重新认识AbstractQueuedSynchronizer
  • day06_算法训练
  • Linux信号机制探析--信号的产生
  • 今年暑期渗透测试面试经验分享
  • java操作redis
  • MySQL各个版本root账号没有最高权限的解决方法
  • C语言典型例题47
  • 对话式人工智能Copilot和Agent之间的差异_2024-08-21
  • 高性能minio集群环境搭建(配视频教程)
  • http基础原理及应用
  • 39岁啦:聊聊我的29岁和39岁
  • 【机器学习】探索机器学习在旅游业的革新之旅
  • glibc 2.24 下 IO_FILE 的利用