自定义控件(8)---PathEffect平滑曲线--点、线、矩形、圆

来源:互联网 发布:江苏网络安全教育平台 编辑:程序博客网 时间:2024/05/16 08:00

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#FFFFFF"    android:orientation="vertical" >    <com.aigestudio.customviewdemo.views.PathEffectView        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>

MeasureUtil

package com.aigestudio.customviewdemo.utils;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Color;import android.util.DisplayMetrics;public final class MeasureUtil {public static int[] getScreenSize(Activity activity) {DisplayMetrics metrics = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);return new int[] { metrics.widthPixels, metrics.heightPixels };}}

MainActivity

package com.aigestudio.customviewdemo.activities;import android.app.Activity;import android.os.Bundle;import com.aigestudio.customviewdemo.R;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}

PathEffectView

package com.aigestudio.customviewdemo.views;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.CornerPathEffect;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PathEffect;import android.util.AttributeSet;import android.view.View;/** * PathEffect */@SuppressLint({ "NewApi", "DrawAllocation" })public class PathEffectView extends View {private Paint mPaint;// 画笔对象private Path mPath;// 路径对象private PathEffect mEffects;// 路径效果数组public PathEffectView(Context context, AttributeSet attrs) {super(context, attrs);/* * 实例化画笔并设置属性 * 描边、宽度、颜色 */mPaint = new Paint();mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(5);mPaint.setColor(Color.DKGRAY);// 实例化路径mPath = new Path();// 定义路径的起点mPath.moveTo(0, 420);// 定义路径的各个点for (int i = 0; i <= 30; i++) {mPath.lineTo(i * 35, (float) (Math.random() * 300));}// 创建路径效果数组}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/* * 实例化各类特效 */mEffects = new CornerPathEffect(50);/* * 绘制路径 */mPaint.setPathEffect(mEffects);canvas.drawPath(mPath, mPaint);// 刷新偏移值并重绘视图实现动画效果invalidate();}}


========================================


activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/root"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.try_paint_blog.MainActivity" ></FrameLayout>

MainActivity

package com.example.try_paint_blog;import android.app.Activity;import android.os.Bundle;import android.widget.FrameLayout;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);              setContentView(R.layout.activity_main);            FrameLayout root=(FrameLayout)findViewById(R.id.root);      root.addView(new MyView(MainActivity.this));    }}

MyView

package com.example.try_paint_blog;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Path;import android.graphics.Rect;import android.graphics.RectF;import android.view.View;public class MyView extends View {Context m_context;public MyView(Context context) {super(context);m_context = context;}// 重写OnDraw()函数,在每次重绘时自主实现绘图@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(Color.RED); // 设置画笔颜色paint.setStyle(Style.FILL);// 设置填充样式paint.setStrokeWidth(5);// 设置画笔宽度/** * 画直线--drawLine(float startX, float startY, float stopX, float stopY, * Paint paint) */canvas.drawLine(0, 10, 100, 10, paint);/** * 两两一直线 (上面有四个点:( 0, 50)、(20, 50),(40, 50),(60, 50)),两两连成一条直线; */float[] pts = { 0, 50, 20, 50, 40, 50, 60, 50 };// drawLines(float[] pts, Paint paint)canvas.drawLines(pts, paint);/** * 画点 .drawPoint(float x, float y, Paint paint) */canvas.drawPoint(100, 100, paint);/** * 多个点float drawPoints里路过前两个数值,即第一个点横纵坐标,画出后面四个数值代表的点,即第二,第三个点 */float[] ptss = { 200, 100, 300, 100, 400, 100, 500, 100 };canvas.drawPoints(ptss, 2, 4, paint);/** * 矩形 .drawRect(float left, float top, float right, float bottom, Paint * paint) */canvas.drawRect(0, 200, 100, 300, paint);// 直接构造RectF rect = new RectF(150, 200, 250, 300);canvas.drawRect(rect, paint);// 使用RectF构造Rect rect2 = new Rect(300, 200, 400, 300);canvas.drawRect(rect2, paint);// 使用Rect构造/** * 圆角 drawRoundRect(RectF rect, float rx, float ry, Paint paint) float * rx:生成圆角的椭圆的X轴半径 float ry:生成圆角的椭圆的Y轴半径 */RectF rect3 = new RectF(0, 350, 200, 450);canvas.drawRoundRect(rect3, 20, 20, paint);/** * 圆 drawCircle(float cx, float cy, float radius, Paint paint) */canvas.drawCircle(400, 400, 50, paint);/** * 三角形 */paint.setStyle(Style.STROKE);// 填充样式改为描边Path path = new Path();path.moveTo(10, 500); // 设定起始点path.lineTo(10, 600);// 第一条直线的终点,也是第二条直线的起点path.lineTo(50, 600);// 画第二条直线path.close();// 闭环canvas.drawPath(path, paint);/** * 椭圆 椭圆是根据矩形生成的,以矩形的长为椭圆的X轴,矩形的宽为椭圆的Y轴,建立的椭圆图形 void drawOval (RectF * oval, Paint paint) */RectF rect22 = new RectF(100, 600, 300, 900);canvas.drawRect(rect, paint);// 画矩形paint.setColor(Color.GREEN);// 更改画笔颜色canvas.drawOval(rect22, paint);// 同一个矩形画椭圆/** * 划弧形drawArc(RectF oval, float startAngle, float sweepAngle, boolean * useCenter, Paint paint) RectF oval:生成椭圆的矩形 float * startAngle:弧开始的角度,以X轴正方向为0度 float sweepAngle:弧持续的角度 boolean * useCenter:是否有弧的两边,True,还两边,False,只有一条弧 *///画笔为描边RectF rect1 = new RectF(500, 600, 600, 800);canvas.drawArc(rect1, 0, 90, true, paint);RectF rect222 = new RectF(700, 600, 800, 800);canvas.drawArc(rect222, 0, 90, false, paint);}}



0 0