diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 004631e..15162e4 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 1a0d6f6..8cb0f21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -16,8 +16,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index b0c7b20..e0d5b93 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -29,7 +29,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 6387a1a..114b26b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,7 +49,8 @@ dependencies { implementation project(':code5_velocitytracker_scroller') implementation project(':code6_flowlayout') implementation project(':code7_svg') - implementation project(':code8_canvas') + implementation project(':code8_canvas_clip') +// implementation project(':code8_canvas') // implementation project(':code9_paint') // implementation project(':code_x1_drawable_gravity') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e567f1..702aead 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,7 +8,7 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/zinc/ui2018/MainActivity.java b/app/src/main/java/com/zinc/ui2018/MainActivity.java index ad1b991..f6d06f0 100644 --- a/app/src/main/java/com/zinc/ui2018/MainActivity.java +++ b/app/src/main/java/com/zinc/ui2018/MainActivity.java @@ -19,6 +19,7 @@ protected void onCreate(Bundle savedInstanceState) { findViewById(R.id.tv_code5_scroller_velocityTracker).setOnClickListener(this); findViewById(R.id.tv_code6_draw_flow).setOnClickListener(this); findViewById(R.id.tv_code7_svg).setOnClickListener(this); + findViewById(R.id.tv_code8_canvas_clip).setOnClickListener(this); } @Override @@ -45,6 +46,9 @@ public void onClick(View view) { case R.id.tv_code7_svg: startActivity(new Intent(this, com.zinc.svg.ClientActivity.class)); break; + case R.id.tv_code8_canvas_clip: + startActivity(new Intent(this, com.zinc.code8_canvas_clip.activity.ClientActivity.class)); + break; } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 612a387..38753e5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -48,6 +48,11 @@ style="@style/textview_button" android:text="svg 使用" /> + + diff --git a/code8_canvas/.gitignore b/code8_canvas_clip/.gitignore similarity index 100% rename from code8_canvas/.gitignore rename to code8_canvas_clip/.gitignore diff --git a/code8_canvas_clip/build.gradle b/code8_canvas_clip/build.gradle new file mode 100644 index 0000000..6f5aeea --- /dev/null +++ b/code8_canvas_clip/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + + defaultConfig { + + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode rootProject.ext.versionCode + versionName rootProject.ext.versionName + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + def lib = rootProject.ext + + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation "com.android.support:appcompat-v7:$lib.appcompatV7" + + implementation project(":lib_base") +} diff --git a/code8_canvas/proguard-rules.pro b/code8_canvas_clip/proguard-rules.pro similarity index 100% rename from code8_canvas/proguard-rules.pro rename to code8_canvas_clip/proguard-rules.pro diff --git a/code8_canvas_clip/src/main/AndroidManifest.xml b/code8_canvas_clip/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a2dc8ec --- /dev/null +++ b/code8_canvas_clip/src/main/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClientActivity.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClientActivity.java new file mode 100644 index 0000000..c8d4dc1 --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClientActivity.java @@ -0,0 +1,40 @@ +package com.zinc.code8_canvas_clip.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.zinc.code8_canvas_clip.R; + +/** + * author : zinc + * time : 2019/4/26 下午12:53 + * desc : + * version : + */ +public class ClientActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_canvas_clip_client); + } + + public void onHeart(View view) { + startActivity(new Intent(this, HeartActivity.class)); + } + + public void onClip(View view) { + startActivity(new Intent(this, ClipActivity.class)); + } + + public void onClipOut(View view) { + startActivity(new Intent(this, ClipOutActivity.class)); + } + + public void onClipPathWithOp(View view) { + startActivity(new Intent(this, ClipOpListActivity.class)); + } +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipActivity.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipActivity.java new file mode 100644 index 0000000..b3a52c5 --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipActivity.java @@ -0,0 +1,22 @@ +package com.zinc.code8_canvas_clip.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.Nullable; + +import com.zinc.code8_canvas_clip.widget.ClipPathView; + +/** + * author : zinc + * time : 2019/4/27 上午10:10 + * desc : + * version : + */ +public class ClipActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new ClipPathView(this)); + } +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOpContentActivity.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOpContentActivity.java new file mode 100644 index 0000000..9577071 --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOpContentActivity.java @@ -0,0 +1,31 @@ +package com.zinc.code8_canvas_clip.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.Nullable; + +import com.zinc.code8_canvas_clip.widget.ClipOpView; + +/** + * author : zinc + * time : 2019/4/26 下午12:35 + * desc : + * version : + */ +public class ClipOpContentActivity extends Activity { + + public static final String CLIP = "CLIP"; + + private ClipOpView mClipOpView; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mClipOpView = new ClipOpView(this); + setContentView(mClipOpView); + + String clip = getIntent().getStringExtra(CLIP); + mClipOpView.setType(clip); + + } +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOpListActivity.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOpListActivity.java new file mode 100644 index 0000000..0f0c274 --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOpListActivity.java @@ -0,0 +1,57 @@ +package com.zinc.code8_canvas_clip.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.zinc.code8_canvas_clip.widget.ClipOpView; +import com.zinc.code8_canvas_clip.R; + +/** + * author : zinc + * time : 2019/4/26 下午12:36 + * desc : + * version : + */ +public class ClipOpListActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_clip_list); + } + + public void onDifference(View view) { + goToClipView(ClipOpView.DIFFERENCE); + } + + public void onIntersect(View view) { + goToClipView(ClipOpView.INTERSECT); + } + + public void onUnion(View view) { + goToClipView(ClipOpView.UNION); + } + + public void onXor(View view) { + goToClipView(ClipOpView.XOR); + } + + public void onReverseDifference(View view) { + goToClipView(ClipOpView.REVERSE_DIFFERENCE); + } + + public void onReplace(View view) { + goToClipView(ClipOpView.REPLACE); + } + + private void goToClipView(String type) { + Intent intent = new Intent(this, ClipOpContentActivity.class); + intent.putExtra(ClipOpContentActivity.CLIP, type); + + startActivity(intent); + } + +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOutActivity.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOutActivity.java new file mode 100644 index 0000000..695c149 --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/ClipOutActivity.java @@ -0,0 +1,22 @@ +package com.zinc.code8_canvas_clip.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.Nullable; + +import com.zinc.code8_canvas_clip.widget.ClipOutPathView; + +/** + * author : zinc + * time : 2019/4/27 上午10:10 + * desc : + * version : + */ +public class ClipOutActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new ClipOutPathView(this)); + } +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/HeartActivity.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/HeartActivity.java new file mode 100644 index 0000000..ceda9e1 --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/activity/HeartActivity.java @@ -0,0 +1,38 @@ +package com.zinc.code8_canvas_clip.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; +import android.widget.TextView; + +import com.zinc.code8_canvas_clip.widget.HeartView; +import com.zinc.code8_canvas_clip.R; + +/** + * author : zinc + * time : 2019/4/21 上午9:29 + * desc : + * version : + */ +public class HeartActivity extends Activity { + + private HeartView heartView; + private TextView tvStart; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_canvas_heart); + + heartView = findViewById(R.id.heart_view); + tvStart = findViewById(R.id.tv_start); + + tvStart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + heartView.start(); + } + }); + } +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipOpView.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipOpView.java new file mode 100644 index 0000000..09eb46e --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipOpView.java @@ -0,0 +1,224 @@ +package com.zinc.code8_canvas_clip.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PointF; +import android.graphics.RectF; +import android.graphics.Region; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.lib_base.BaseView; + +import java.util.ArrayList; +import java.util.List; + +/** + * author : zinc + * time : 2019/4/26 上午12:22 + * desc : + * version : + */ +public class ClipOpView extends BaseView { + + // 是A形状中不同于B的部分显示出来 + public static final String DIFFERENCE = "DIFFERENCE"; + // 是A和B交集的形状 + public static final String INTERSECT = "INTERSECT"; + // 是A和B的全集 + public static final String UNION = "UNION"; + // 是全集形状减去交集形状之后的部分 + public static final String XOR = "XOR"; + // 是B形状中不同于A的部分显示出来,这是没有设置时候默认的 + public static final String REVERSE_DIFFERENCE = "REVERSE_DIFFERENCE"; + // 是只显示B的形状 + public static final String REPLACE = "REPLACE"; + + private Path mHeartPath; + private Path mCirclePath; + + private RectF mHeartRect; + + private int mHeartAlphaColor; + private int mCircleAlphaColor; + private int mBackgroundColor; + private int mTextColor; + + private int mTextSize; + + private Paint mPaint; + + private String mType; + + public ClipOpView(Context context) { + this(context, null); + } + + public ClipOpView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public ClipOpView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + public void setType(String type) { + this.mType = type; + postInvalidate(); + } + + @Override + protected void init(Context context) { + + mPaint = new Paint(); + mPaint.setAntiAlias(true); + + mHeartAlphaColor = Color.parseColor("#aabe97dc"); + mCircleAlphaColor = Color.parseColor("#aa226089"); + mBackgroundColor = Color.parseColor("#df0e62"); + mTextColor = Color.parseColor("#f54291"); + + mTextSize = dpToPx(14); + + mHeartPath = new Path(); + createHeart(mHeartPath); + + mHeartRect = new RectF(); + mHeartPath.computeBounds(mHeartRect, true); + + mCirclePath = new Path(); + mCirclePath.addCircle(0, + mHeartRect.bottom, + mHeartRect.width() / 2, + Path.Direction.CCW); + + } + + @Override + protected void onDraw(Canvas canvas) { + drawCoordinate(canvas); + + canvasText(canvas); + + drawSourcePic(canvas); + + drawClip(canvas); + } + + private void canvasText(Canvas canvas) { + canvas.save(); + + mPaint.setColor(mTextColor); + mPaint.setTextSize(mTextSize); + mPaint.setTextAlign(Paint.Align.CENTER); + canvas.drawText(mType, getWidth() / 2, mTextSize * 2, mPaint); + + canvas.restore(); + } + + private void drawSourcePic(Canvas canvas) { + canvas.save(); + + mPaint.setColor(mHeartAlphaColor); + canvas.translate(mHeartRect.width() / 2 + 50, + mHeartRect.height() / 2 + 50); + canvas.drawPath(mHeartPath, mPaint); + + mPaint.setColor(mCircleAlphaColor); + canvas.translate(mHeartRect.width() + 50, -mHeartRect.bottom + 50); + canvas.drawPath(mCirclePath, mPaint); + + canvas.restore(); + } + + private void drawClip(Canvas canvas) { + canvas.translate(getWidth() / 2, getHeight() / 2); + + mPaint.setStyle(Paint.Style.FILL); + + mPaint.setColor(mHeartAlphaColor); + canvas.drawPath(mHeartPath, mPaint); + + mPaint.setColor(mCircleAlphaColor); + canvas.drawPath(mCirclePath, mPaint); + + canvas.clipPath(mHeartPath); + + Region.Op op; + switch (mType) { + case DIFFERENCE: + op = Region.Op.DIFFERENCE; + break; + // 是A和B交集的形状 + case INTERSECT: + op = Region.Op.INTERSECT; + break; + // 是A和B的全集 + case UNION: + op = Region.Op.UNION; + break; + // 是全集形状减去交集形状之后的部分 + case XOR: + op = Region.Op.XOR; + break; + // 是B形状中不同于A的部分显示出来,这是没有设置时候默认的 + case REVERSE_DIFFERENCE: + op = Region.Op.REVERSE_DIFFERENCE; + break; + // 是只显示B的形状 + case REPLACE: + op = Region.Op.REPLACE; + break; + default: + op = Region.Op.INTERSECT; + break; + } + canvas.clipPath(mCirclePath, op); + canvas.drawColor(mBackgroundColor); + } + + /** + * 构建心形 + */ + private void createHeart(Path path) { + List pointList = new ArrayList<>(); + pointList.add(new PointF(0, -76)); + pointList.add(new PointF(100, -206)); + pointList.add(new PointF(224, -122)); + pointList.add(new PointF(224, -24)); + pointList.add(new PointF(224, 74)); + pointList.add(new PointF(102, 180)); + pointList.add(new PointF(0, 258)); + pointList.add(new PointF(-102, 180)); + pointList.add(new PointF(-224, 74)); + pointList.add(new PointF(-224, -24)); + pointList.add(new PointF(-224, -122)); + pointList.add(new PointF(-100, -206)); + + path.reset(); + for (int i = 0; i < 4; i++) { + if (i == 0) { + path.moveTo(pointList.get(i * 3).x, pointList.get(i * 3).y); + } else { + path.lineTo(pointList.get(i * 3).x, pointList.get(i * 3).y); + } + + int endPointIndex; + if (i == 3) { + endPointIndex = 0; + } else { + endPointIndex = i * 3 + 3; + } + + path.cubicTo(pointList.get(i * 3 + 1).x, pointList.get(i * 3 + 1).y, + pointList.get(i * 3 + 2).x, pointList.get(i * 3 + 2).y, + pointList.get(endPointIndex).x, pointList.get(endPointIndex).y); + } + path.close(); + } + +} diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/ClipView.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipOutPathView.java similarity index 65% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/ClipView.java rename to code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipOutPathView.java index c6c4a8f..2cc83aa 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/ClipView.java +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipOutPathView.java @@ -1,25 +1,19 @@ -package com.zinc.canvas.widget.draw; +package com.zinc.code8_canvas_clip.widget; -import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Region; import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.util.DisplayMetrics; -import android.util.Log; import android.view.View; -import android.view.animation.LinearInterpolator; -import com.zinc.canvas.R; +import com.zinc.code8_canvas_clip.R; import java.util.ArrayList; import java.util.List; @@ -30,30 +24,22 @@ * desc : * version : */ -public class ClipView extends View { - - private static final int DEGREE_COUNT = 12; +public class ClipOutPathView extends View { private Paint mPaint; - private RectF mRectF; - private Rect mRect; private int mBgColor; - - private Rect mClipRect; - private RectF mPathRect; - private Path mPath; - public ClipView(Context context) { + public ClipOutPathView(Context context) { this(context, null); } - public ClipView(Context context, @Nullable AttributeSet attrs) { + public ClipOutPathView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } - public ClipView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + public ClipOutPathView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } @@ -64,14 +50,9 @@ private void init(Context context) { mBgColor = ContextCompat.getColor(context, R.color.canvas_red_color); - mRectF = new RectF(); - mRect = new Rect(); mPath = new Path(); createHeart(mPath); - mClipRect = new Rect(); - mPathRect = new RectF(); - } @Override @@ -80,33 +61,12 @@ protected void onDraw(Canvas canvas) { canvas.translate(getWidth() / 2, getHeight() / 2); - canvas.clipPath(mPath, Region.Op.DIFFERENCE); -// canvas.clipPath(mPath); - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// canvas.clipOutRect(mRect); -// } - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// canvas.clipOutRect(mRectF); -// } - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// canvas.clipOutRect(0, 0, 100, 100); -// } - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// canvas.clipOutRect(0f, 0f, 100f, 100f); -// } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + canvas.clipOutPath(mPath); + } canvas.drawColor(mBgColor); - canvas.getClipBounds(mClipRect); - - mPath.computeBounds(mPathRect, false); - Log.i("ClipView", "clipRect: " + mClipRect.toString() + "\n" - + "pathRect: " + mPathRect.toString()); - } /** diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipPathView.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipPathView.java new file mode 100644 index 0000000..02e314d --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/ClipPathView.java @@ -0,0 +1,115 @@ +package com.zinc.code8_canvas_clip.widget; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PointF; +import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.View; + +import com.zinc.code8_canvas_clip.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * author : zinc + * time : 2019/4/21 下午8:35 + * desc : + * version : + */ +public class ClipPathView extends View { + + private Paint mPaint; + + private int mBgColor; + + private Path mPath; + + public ClipPathView(Context context) { + this(context, null); + } + + public ClipPathView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public ClipPathView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context) { + mPaint = new Paint(); + mPaint.setAntiAlias(true); + + mBgColor = ContextCompat.getColor(context, R.color.canvas_red_color); + + mPath = new Path(); + createHeart(mPath); + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + canvas.translate(getWidth() / 2, getHeight() / 2); + + canvas.clipPath(mPath); + + canvas.drawColor(mBgColor); + + } + + /** + * 构建心形 + */ + private void createHeart(Path path) { + List pointList = new ArrayList<>(); + pointList.add(new PointF(0, dpToPx(-38))); + pointList.add(new PointF(dpToPx(50), dpToPx(-103))); + pointList.add(new PointF(dpToPx(112), dpToPx(-61))); + pointList.add(new PointF(dpToPx(112), dpToPx(-12))); + pointList.add(new PointF(dpToPx(112), dpToPx(37))); + pointList.add(new PointF(dpToPx(51), dpToPx(90))); + pointList.add(new PointF(0, dpToPx(129))); + pointList.add(new PointF(dpToPx(-51), dpToPx(90))); + pointList.add(new PointF(dpToPx(-112), dpToPx(37))); + pointList.add(new PointF(dpToPx(-112), dpToPx(-12))); + pointList.add(new PointF(dpToPx(-112), dpToPx(-61))); + pointList.add(new PointF(dpToPx(-50), dpToPx(-103))); + + path.reset(); + for (int i = 0; i < 4; i++) { + if (i == 0) { + path.moveTo(pointList.get(i * 3).x, pointList.get(i * 3).y); + } else { + path.lineTo(pointList.get(i * 3).x, pointList.get(i * 3).y); + } + + int endPointIndex; + if (i == 3) { + endPointIndex = 0; + } else { + endPointIndex = i * 3 + 3; + } + + path.cubicTo(pointList.get(i * 3 + 1).x, pointList.get(i * 3 + 1).y, + pointList.get(i * 3 + 2).x, pointList.get(i * 3 + 2).y, + pointList.get(endPointIndex).x, pointList.get(endPointIndex).y); + } + path.close(); + } + + protected int dpToPx(float dpValue) { + DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); + return (int) (dpValue * metrics.density + 0.5f); + } + +} diff --git a/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/HeartView.java b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/HeartView.java new file mode 100644 index 0000000..ee2d2fd --- /dev/null +++ b/code8_canvas_clip/src/main/java/com/zinc/code8_canvas_clip/widget/HeartView.java @@ -0,0 +1,348 @@ +package com.zinc.code8_canvas_clip.widget; + +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PointF; +import android.graphics.RectF; +import android.graphics.Typeface; +import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.View; +import android.view.animation.LinearInterpolator; + +import com.zinc.code8_canvas_clip.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * author : zinc + * time : 2019/4/20 上午10:05 + * desc : + * version : + */ +public class HeartView extends View { + + private static final String SHOW_CONTENT = "猛猛的小盆友"; + + private Paint mPaint; + + private Path mHeartPath; + + private RectF mHeartRect; + + private int mTextSize; + + private float mCurPos; + + private ObjectAnimator mUpAnim; + + private ValueAnimator mBezierAnim; + + private AnimatorSet mAnimSet; + + private int mTopBgColor; + private int mBottomBgColor; + + // 当前的偏移量 + private int mCurOffset = 0; + // 每次的偏移量 + private int mOffset; + + private Path mTopPath; + private Path mBottomPath; + + private int mBezierHeight; + + public HeartView(Context context) { + this(context, null); + } + + public HeartView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public HeartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context) { + // 初始化变量 + mTextSize = dpToPx(16); + mOffset = dpToPx(2.5f); + mBezierHeight = dpToPx(10); + + mTopBgColor = ContextCompat.getColor(context, R.color.canvas_pink_color); + mBottomBgColor = ContextCompat.getColor(context, R.color.canvas_light_blue_color); + + // 初始化对象 + mPaint = new Paint(); + mPaint.setAntiAlias(true); + + mHeartRect = new RectF(); + mTopPath = new Path(); + mBottomPath = new Path(); + + // 初始化心形路径 + mHeartPath = new Path(); + createHeart(mHeartPath); + mCurPos = mHeartRect.bottom; + + // 贝塞尔曲线动画 + mBezierAnim = ValueAnimator.ofFloat(0, 1f); + mBezierAnim.setDuration(4_000); + mBezierAnim.setRepeatCount(ValueAnimator.INFINITE); + mBezierAnim.setInterpolator(new LinearInterpolator()); + mBezierAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mCurOffset = (mCurOffset + mOffset) % (int) mWidth; + } + }); + + // 初始化 增加的动画 + mUpAnim = ObjectAnimator.ofFloat(this, "process", 0, 1); + mUpAnim.setInterpolator(new LinearInterpolator()); + mUpAnim.setDuration(6_000); + } + + /** + * 构建心形 + */ + private void createHeart(Path path) { + List pointList = new ArrayList<>(); + pointList.add(new PointF(0, dpToPx(-38))); + pointList.add(new PointF(dpToPx(50), dpToPx(-103))); + pointList.add(new PointF(dpToPx(112), dpToPx(-61))); + pointList.add(new PointF(dpToPx(112), dpToPx(-12))); + pointList.add(new PointF(dpToPx(112), dpToPx(37))); + pointList.add(new PointF(dpToPx(51), dpToPx(90))); + pointList.add(new PointF(0, dpToPx(129))); + pointList.add(new PointF(dpToPx(-51), dpToPx(90))); + pointList.add(new PointF(dpToPx(-112), dpToPx(37))); + pointList.add(new PointF(dpToPx(-112), dpToPx(-12))); + pointList.add(new PointF(dpToPx(-112), dpToPx(-61))); + pointList.add(new PointF(dpToPx(-50), dpToPx(-103))); + + path.reset(); + for (int i = 0; i < 4; i++) { + if (i == 0) { + path.moveTo(pointList.get(i * 3).x, pointList.get(i * 3).y); + } else { + path.lineTo(pointList.get(i * 3).x, pointList.get(i * 3).y); + } + + int endPointIndex; + if (i == 3) { + endPointIndex = 0; + } else { + endPointIndex = i * 3 + 3; + } + + path.cubicTo(pointList.get(i * 3 + 1).x, pointList.get(i * 3 + 1).y, + pointList.get(i * 3 + 2).x, pointList.get(i * 3 + 2).y, + pointList.get(endPointIndex).x, pointList.get(endPointIndex).y); + } + path.close(); + + path.computeBounds(mHeartRect, false); + } + + public void start() { + if (mAnimSet != null) { + mAnimSet.cancel(); + } + + mAnimSet = new AnimatorSet(); + mAnimSet.play(mUpAnim) + .with(mBezierAnim); + mAnimSet.start(); + + } + + /** + * 当前进度 + * + * @param process 范围 [0-1] + */ + public void setProcess(float process) { + // 如果心形的rect为空,直接中止 + if (mHeartRect.isEmpty()) { + if (mUpAnim != null) { + mUpAnim.cancel(); + } + + return; + } + + float curHeight = mHeartRect.height() * process; + + mCurPos = mHeartRect.bottom - curHeight; + postInvalidate(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); + + int waveLength = width / 3; + int totalLength = width * 2 + waveLength; + + // 初始化 浪的路径 + initPath(mTopPath, + waveLength, + mBezierHeight, + totalLength, + width, + height, + true); + + // 初始化 浪的路径 + initPath(mBottomPath, waveLength, + mBezierHeight, + totalLength, + width, + height, + false); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + int width = getWidth(); + int height = getHeight(); + + canvas.translate(width / 2, height / 2); + + canvas.clipPath(mHeartPath); + + canvas.save(); + canvas.translate(-mCurOffset, mCurPos); + + canvas.clipPath(mTopPath); + mPaint.setColor(mTopBgColor); + mPaint.setStyle(Paint.Style.FILL); + canvas.drawPath(mTopPath, mPaint); + + canvas.translate(mCurOffset, -mCurPos); + drawText(canvas, mBottomBgColor); + canvas.restore(); + + canvas.save(); + canvas.translate(-mCurOffset, mCurPos); + canvas.clipPath(mBottomPath); + mPaint.setColor(ContextCompat.getColor(getContext(), R.color.canvas_light_blue_color)); + mPaint.setStyle(Paint.Style.FILL); + canvas.drawPath(mBottomPath, mPaint); + + canvas.translate(mCurOffset, -mCurPos); + drawText(canvas, mTopBgColor); + canvas.restore(); + + } + + private float mWidth; + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mWidth = w; + } + + private void drawText(Canvas canvas, int textColor) { + mPaint.setColor(textColor); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(mTextSize); + mPaint.setTypeface(Typeface.SANS_SERIF); + + Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); + float y = fontMetrics.bottom; + + canvas.drawText(SHOW_CONTENT, 0, y, mPaint); + } + + /** + * @param path 路径 + * @param length 曲线的宽度 + * @param height 贝塞尔曲线的高度 + * @param totalLength 总长度 + * @param screenWidth 屏幕宽 + * @param screenHeight 屏幕高 + * @param isTop 是否为上部份 + */ + private void initPath(Path path, + int length, + int height, + int totalLength, + int screenWidth, + int screenHeight, + boolean isTop) { + + int left; + int right; + int top; + int bottom; + + if (isTop) { + left = -length - screenWidth / 2; + right = screenWidth + screenWidth / 2; + top = -screenHeight; + bottom = 0; + path.moveTo(left, bottom); + } else { + left = -length - screenWidth / 2; + right = screenWidth + screenWidth / 2; + top = 0; + bottom = screenHeight; + path.moveTo(left, top); + } + + for (int i = -length; i < totalLength; i += length) { + // rQuadTo 和 quadTo 区别在于 + // rQuadTo 是相对上一个点 而 quadTo是相对于画布 + path.rQuadTo(length / 4, + -height, + length / 2, + 0); + path.rQuadTo(length / 4, + height, + length / 2, + 0); + } + + if (isTop) { + path.lineTo(right, top); + path.lineTo(left, top); + } else { + path.lineTo(right, bottom); + path.lineTo(left, bottom); + } + + path.close(); + } + + /** + * 转换 dp 至 px + * + * @param dpValue dp值 + * @return px值 + */ + protected int dpToPx(float dpValue) { + DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); + return (int) (dpValue * metrics.density + 0.5f); + } +} diff --git a/code8_canvas_clip/src/main/res/layout/activity_canvas_clip_client.xml b/code8_canvas_clip/src/main/res/layout/activity_canvas_clip_client.xml new file mode 100644 index 0000000..356889c --- /dev/null +++ b/code8_canvas_clip/src/main/res/layout/activity_canvas_clip_client.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/code8_canvas_clip/src/main/res/layout/activity_canvas_heart.xml b/code8_canvas_clip/src/main/res/layout/activity_canvas_heart.xml new file mode 100644 index 0000000..eb8606d --- /dev/null +++ b/code8_canvas_clip/src/main/res/layout/activity_canvas_heart.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/code8_canvas_clip/src/main/res/layout/activity_clip_list.xml b/code8_canvas_clip/src/main/res/layout/activity_clip_list.xml new file mode 100644 index 0000000..040f377 --- /dev/null +++ b/code8_canvas_clip/src/main/res/layout/activity_clip_list.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code8_canvas_clip/src/main/res/values/strings.xml b/code8_canvas_clip/src/main/res/values/strings.xml new file mode 100644 index 0000000..528f6ab --- /dev/null +++ b/code8_canvas_clip/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + code8_canvas_clip + diff --git a/code8_canvas_draw/.gitignore b/code8_canvas_draw/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/code8_canvas_draw/.gitignore @@ -0,0 +1 @@ +/build diff --git a/code8_canvas/build.gradle b/code8_canvas_draw/build.gradle similarity index 100% rename from code8_canvas/build.gradle rename to code8_canvas_draw/build.gradle diff --git a/code8_canvas_draw/proguard-rules.pro b/code8_canvas_draw/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/code8_canvas_draw/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/code8_canvas/src/main/AndroidManifest.xml b/code8_canvas_draw/src/main/AndroidManifest.xml similarity index 88% rename from code8_canvas/src/main/AndroidManifest.xml rename to code8_canvas_draw/src/main/AndroidManifest.xml index b631266..5b62c20 100644 --- a/code8_canvas/src/main/AndroidManifest.xml +++ b/code8_canvas_draw/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/code8_canvas/src/main/java/com/zinc/canvas/activity/ClientActivity.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/ClientActivity.java similarity index 69% rename from code8_canvas/src/main/java/com/zinc/canvas/activity/ClientActivity.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/activity/ClientActivity.java index 266c9d5..e73d2ec 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/activity/ClientActivity.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/ClientActivity.java @@ -7,15 +7,6 @@ import android.view.View; import com.zinc.canvas.R; -import com.zinc.canvas.widget.draw.ArcView; -import com.zinc.canvas.widget.draw.BackgroundView; -import com.zinc.canvas.widget.draw.ClipView; -import com.zinc.canvas.widget.draw.LineView; -import com.zinc.canvas.widget.draw.OvalView; -import com.zinc.canvas.widget.draw.PathTextView; -import com.zinc.canvas.widget.draw.PointView; -import com.zinc.canvas.widget.draw.RectView; -import com.zinc.canvas.widget.draw.TextView; /** * author : Jiang zinc diff --git a/code8_canvas/src/main/java/com/zinc/canvas/activity/ClockActivity.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/ClockActivity.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/activity/ClockActivity.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/activity/ClockActivity.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/activity/CommonListActivity.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/CommonListActivity.java similarity index 82% rename from code8_canvas/src/main/java/com/zinc/canvas/activity/CommonListActivity.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/activity/CommonListActivity.java index b771c22..9e5ca9b 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/activity/CommonListActivity.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/CommonListActivity.java @@ -19,7 +19,7 @@ public class CommonListActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_common_list); + setContentView(R.layout.activity_draw_list); } public void onClip(View view) { @@ -43,23 +43,23 @@ public void onOval(View view) { } public void onPoint(View view) { - goToAct(CommonOperatorActivity.OVAL); + goToAct(CommonOperatorActivity.POINT); } public void onText(View view) { - goToAct(CommonOperatorActivity.OVAL); + goToAct(CommonOperatorActivity.TEXT); } public void onRect(View view) { - goToAct(CommonOperatorActivity.OVAL); + goToAct(CommonOperatorActivity.RECT); } public void onColor(View view) { - goToAct(CommonOperatorActivity.OVAL); + goToAct(CommonOperatorActivity.COLOR); } public void onPathText(View view) { - goToAct(CommonOperatorActivity.OVAL); + goToAct(CommonOperatorActivity.TEXT_PATH); } private void goToAct(int type) { diff --git a/code8_canvas/src/main/java/com/zinc/canvas/activity/CommonOperatorActivity.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/CommonOperatorActivity.java similarity index 80% rename from code8_canvas/src/main/java/com/zinc/canvas/activity/CommonOperatorActivity.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/activity/CommonOperatorActivity.java index 79c0681..22e1310 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/activity/CommonOperatorActivity.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/CommonOperatorActivity.java @@ -1,7 +1,6 @@ package com.zinc.canvas.activity; import android.app.Activity; -import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.View; @@ -14,10 +13,12 @@ import com.zinc.canvas.widget.draw.ClipView; import com.zinc.canvas.widget.draw.LineView; import com.zinc.canvas.widget.draw.OvalView; -import com.zinc.canvas.widget.draw.PathTextView; +import com.zinc.canvas.widget.text.TextOnPathView; import com.zinc.canvas.widget.draw.PointView; import com.zinc.canvas.widget.draw.RectView; -import com.zinc.canvas.widget.draw.TextView; +import com.zinc.canvas.widget.text.TextPosText; +import com.zinc.canvas.widget.text.TextRunView; +import com.zinc.canvas.widget.text.TextView; /** * author : zinc @@ -38,7 +39,9 @@ public class CommonOperatorActivity extends Activity { public static final int TEXT = 7; public static final int RECT = 8; public static final int COLOR = 9; - public static final int PATH_TEXT = 10; + public static final int TEXT_PATH = 10; + public static final int TEXT_RUN = 11; + public static final int TEXT_POS = 12; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -77,8 +80,14 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { case COLOR: view = new BackgroundView(this); break; - case PATH_TEXT: - view = new PathTextView(this); + case TEXT_PATH: + view = new TextOnPathView(this); + break; + case TEXT_RUN: + view = new TextRunView(this); + break; + case TEXT_POS: + view = new TextPosText(this); break; default: view = new ClipView(this); diff --git a/code8_canvas/src/main/java/com/zinc/canvas/activity/HeartActivity.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/HeartActivity.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/activity/HeartActivity.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/activity/HeartActivity.java diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/TextListActivity.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/TextListActivity.java new file mode 100644 index 0000000..e89f287 --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/activity/TextListActivity.java @@ -0,0 +1,47 @@ +package com.zinc.canvas.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.zinc.canvas.R; + +/** + * author : zinc + * time : 2019/4/24 下午11:32 + * desc : + * version : + */ +public class TextListActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_text_list); + } + + public void onText(View view) { + goToAct(CommonOperatorActivity.TEXT); + } + + public void onTextPath(View view) { + goToAct(CommonOperatorActivity.TEXT_PATH); + } + + public void onTextRun(View view) { + goToAct(CommonOperatorActivity.TEXT_RUN); + } + + public void onTextPos(View view) { + goToAct(CommonOperatorActivity.TEXT_POS); + } + + private void goToAct(int type) { + Intent intent = new Intent(this, CommonOperatorActivity.class); + intent.putExtra(CommonOperatorActivity.TYPE, type); + startActivity(intent); + } + +} diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/ClockView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/ClockView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/ClockView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/ClockView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/HeartView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/HeartView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/HeartView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/HeartView.java diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/MatrixView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/MatrixView.java new file mode 100644 index 0000000..9f318cd --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/MatrixView.java @@ -0,0 +1,27 @@ +package com.zinc.canvas.widget.control; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/25 下午11:44 + * desc : + * version : + */ +public class MatrixView extends BaseDrawView { + public MatrixView(Context context) { + super(context); + } + + public MatrixView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public MatrixView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } +} diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/RotateView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/RotateView.java new file mode 100644 index 0000000..f80c4f0 --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/RotateView.java @@ -0,0 +1,29 @@ +package com.zinc.canvas.widget.control; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/25 下午11:44 + * desc : + * version : + */ +public class RotateView extends BaseDrawView { + public RotateView(Context context) { + super(context); + } + + public RotateView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public RotateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + +} diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/ScaleView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/ScaleView.java new file mode 100644 index 0000000..6f6d8fd --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/ScaleView.java @@ -0,0 +1,27 @@ +package com.zinc.canvas.widget.control; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/25 下午11:44 + * desc : + * version : + */ +public class ScaleView extends BaseDrawView { + public ScaleView(Context context) { + super(context); + } + + public ScaleView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public ScaleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } +} diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/Skew.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/Skew.java new file mode 100644 index 0000000..c6dc4fc --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/Skew.java @@ -0,0 +1,27 @@ +package com.zinc.canvas.widget.control; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/25 下午11:44 + * desc : + * version : + */ +public class Skew extends BaseDrawView { + public Skew(Context context) { + super(context); + } + + public Skew(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public Skew(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } +} diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/TranslateView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/TranslateView.java new file mode 100644 index 0000000..ddb508d --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/control/TranslateView.java @@ -0,0 +1,27 @@ +package com.zinc.canvas.widget.control; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/25 下午11:44 + * desc : + * version : + */ +public class TranslateView extends BaseDrawView { + public TranslateView(Context context) { + super(context); + } + + public TranslateView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public TranslateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } +} diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/ArcView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/ArcView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/ArcView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/ArcView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/BackgroundView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/BackgroundView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/BackgroundView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/BackgroundView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/BaseDrawView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/BaseDrawView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/BaseDrawView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/BaseDrawView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/CircleView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/CircleView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/CircleView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/CircleView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/LineView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/LineView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/LineView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/LineView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/OvalView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/OvalView.java similarity index 100% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/OvalView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/OvalView.java diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/PointView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/PointView.java similarity index 92% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/PointView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/PointView.java index 8f18dcd..6d39a34 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/PointView.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/PointView.java @@ -52,7 +52,7 @@ protected void onDraw(Canvas canvas) { setPaint(mColor2, mPointWidth1); canvas.drawPoints(pts, mPaint); - setPaint(mColor1, mPointWidth2); - canvas.drawPoints(pts, 2, pts.length - 3, mPaint); +// setPaint(mColor1, mPointWidth2); +// canvas.drawPoints(pts, 2, pts.length - 3, mPaint); } } diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/RectView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/RectView.java similarity index 95% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/RectView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/RectView.java index f003176..a06695c 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/RectView.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/draw/RectView.java @@ -43,7 +43,7 @@ protected void onDraw(Canvas canvas) { setPaint(mColor2, mLineWidth); mPaint.setStyle(Paint.Style.STROKE); canvas.translate(0, mRectF.height() + dpToPx(100)); - canvas.drawRoundRect(mRectF, 50, 50, mPaint); + canvas.drawRoundRect(mRectF, 50, 150, mPaint); canvas.restore(); } diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/PathTextView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextOnPathView.java similarity index 53% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/PathTextView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextOnPathView.java index e35062e..7f33f20 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/PathTextView.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextOnPathView.java @@ -1,10 +1,17 @@ -package com.zinc.canvas.widget.draw; +package com.zinc.canvas.widget.text; +import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; import android.graphics.Path; +import android.graphics.PathMeasure; import android.support.annotation.Nullable; import android.util.AttributeSet; +import android.view.animation.LinearInterpolator; + +import com.zinc.canvas.widget.draw.BaseDrawView; /** * author : zinc @@ -12,23 +19,24 @@ * desc : * version : */ -public class PathTextView extends BaseDrawView { +public class TextOnPathView extends BaseDrawView { private static final String CONTENT = "zinc 猛猛的小盆友"; + private static final char[] C = "https://blog.csdn.net/weixin_37625173".toCharArray(); private Path mPath; private int mTextSize; - public PathTextView(Context context) { + public TextOnPathView(Context context) { super(context); } - public PathTextView(Context context, @Nullable AttributeSet attrs) { + public TextOnPathView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } - public PathTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + public TextOnPathView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @@ -45,13 +53,30 @@ protected void init(Context context) { protected void onDraw(Canvas canvas) { super.onDraw(canvas); - initPath(mPath, 150, 200, getWidth()); + if(mPath.isEmpty()){ + initPath(mPath, 200, 50, getWidth()); + } mPaint.setColor(mColor1); mPaint.setTextSize(mTextSize); - canvas.drawTextOnPath(CONTENT, mPath, 0, 0, mPaint); + mPaint.setColor(Color.RED); + mPaint.setStrokeWidth(mBorderWidth); + mPaint.setStyle(Paint.Style.STROKE); + canvas.drawPath(mPath, mPaint); + + canvas.translate(0, 300); + + mPaint.setColor(mColor2); + mPaint.setTextSize(dpToPx(18)); + canvas.drawTextOnPath(C, 2, 20, mPath, 0, 0, mPaint); + + mPaint.setColor(Color.RED); + mPaint.setStrokeWidth(mBorderWidth); + mPaint.setStyle(Paint.Style.STROKE); + canvas.drawPath(mPath, mPaint); + } /** @@ -65,9 +90,9 @@ private void initPath(Path path, int height, int screenWidth) { - path.moveTo(-screenWidth / 2, 0); + path.moveTo(-screenWidth / 3, 0); - for (int i = 0; i < screenWidth; i += length) { + for (int i = 0; i < screenWidth * 2 / 3; i += length) { path.rQuadTo(length / 4, -height, length / 2, diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextPosText.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextPosText.java new file mode 100644 index 0000000..3d1823d --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextPosText.java @@ -0,0 +1,72 @@ +package com.zinc.canvas.widget.text; + +import android.content.Context; +import android.graphics.Canvas; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/25 下午11:19 + * desc : + * version : + */ +public class TextPosText extends BaseDrawView { + + private static final String CONTENT = "猛猛的小盆友"; + + private static final float[] pos1 = new float[]{ + -300, -600, + -250, -500, + -200, -400, + -150, -300, + -100, -200, + -50, -100, + }; + + private static final float[] pos2 = new float[]{ + -300, 100, + -250, 200, + -200, 300, + -150, 400, + -100, 500, + }; + + private int mTextSize; + + public TextPosText(Context context) { + super(context); + } + + public TextPosText(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public TextPosText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void init(Context context) { + super.init(context); + mTextSize = dpToPx(14); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + mPaint.setColor(mColor1); + mPaint.setTextSize(mTextSize); + + canvas.drawPosText(CONTENT, pos1, mPaint); + + mPaint.setColor(mColor2); + mPaint.setTextSize(mTextSize); + canvas.drawPosText(CONTENT.toCharArray(), 1, 4, pos2, mPaint); + + } + +} diff --git a/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextRunView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextRunView.java new file mode 100644 index 0000000..5f226c0 --- /dev/null +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextRunView.java @@ -0,0 +1,79 @@ +package com.zinc.canvas.widget.text; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.os.Build; +import android.support.annotation.Nullable; +import android.util.AttributeSet; + +import com.zinc.canvas.widget.draw.BaseDrawView; + +/** + * author : zinc + * time : 2019/4/22 下午5:05 + * desc : + * version : + */ +public class TextRunView extends BaseDrawView { + + private static final String CONTENT_S = "عرفي تحكي عربي"; + + private static final char[] CONTENT = CONTENT_S.toCharArray(); + + private int mTextSize; + + public TextRunView(Context context) { + super(context); + } + + public TextRunView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public TextRunView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void init(Context context) { + super.init(context); + + mTextSize = dpToPx(14); + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + int x = -100; + + mPaint.setColor(mColor1); + mPaint.setTextSize(mTextSize); + canvas.drawText(CONTENT, 0, CONTENT.length, x, -300, mPaint); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + canvas.drawTextRun(CONTENT, 0, CONTENT.length, + 0, CONTENT.length, x, -200, false, mPaint); + } + +// mPaint.setColor(mColor2); +// mPaint.setTextSize(mTextSize); +// canvas.drawText(CONTENT, 0, CONTENT.length - 1, x, 0, mPaint); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// canvas.drawTextRun(CONTENT, 0, CONTENT.length - 1, +// 0, CONTENT.length - 1, x, 100, false, mPaint); +// } + + mPaint.setColor(mColor1); + mPaint.setTextSize(mTextSize); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + canvas.drawTextRun(CONTENT, 1, CONTENT.length - 2, + 0, CONTENT.length, x, 300, true, mPaint); + } + + } + +} diff --git a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/TextView.java b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextView.java similarity index 61% rename from code8_canvas/src/main/java/com/zinc/canvas/widget/draw/TextView.java rename to code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextView.java index acc0946..fcceea3 100644 --- a/code8_canvas/src/main/java/com/zinc/canvas/widget/draw/TextView.java +++ b/code8_canvas_draw/src/main/java/com/zinc/canvas/widget/text/TextView.java @@ -1,10 +1,12 @@ -package com.zinc.canvas.widget.draw; +package com.zinc.canvas.widget.text; import android.content.Context; import android.graphics.Canvas; import android.support.annotation.Nullable; import android.util.AttributeSet; +import com.zinc.canvas.widget.draw.BaseDrawView; + /** * author : zinc * time : 2019/4/22 上午9:23 @@ -15,9 +17,11 @@ public class TextView extends BaseDrawView { private static final String CONTENT = "zinc 猛猛的小盆友"; - private int mTextSize; + private static final CharSequence SEQ = "https://blog.csdn.net/weixin_37625173"; - private float[] mPos; + private static final char[] C = "https://github.com/zincPower/UI2018".toCharArray(); + + private int mTextSize; public TextView(Context context) { super(context); @@ -35,9 +39,6 @@ public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) protected void init(Context context) { super.init(context); mTextSize = dpToPx(14); - mPos = new float[]{ - 0, dpToPx(200) - }; } @Override @@ -47,10 +48,18 @@ protected void onDraw(Canvas canvas) { setPaint(mColor1, mLineWidth); mPaint.setTextSize(mTextSize); - canvas.drawText(CONTENT, 0, 0, mPaint); + int x = -300; + + canvas.drawText(CONTENT, x, -500, mPaint); + canvas.drawText(CONTENT, 3, CONTENT.length(), x, -400, mPaint); + + + canvas.drawText(C, 0, C.length, x, -100, mPaint); + canvas.drawText(C, 5, 10, x, 0, mPaint); + - canvas.drawText(CONTENT, 3, CONTENT.length(), - 0, dpToPx(100), mPaint); + canvas.drawText(SEQ, 0, SEQ.length(), x, 300, mPaint); + canvas.drawText(SEQ, 6, 20, x, 400, mPaint); } } diff --git a/code8_canvas/src/main/res/drawable/logo.png b/code8_canvas_draw/src/main/res/drawable/logo.png similarity index 100% rename from code8_canvas/src/main/res/drawable/logo.png rename to code8_canvas_draw/src/main/res/drawable/logo.png diff --git a/code8_canvas/src/main/res/layout/activity_canvas_client.xml b/code8_canvas_draw/src/main/res/layout/activity_canvas_client.xml similarity index 100% rename from code8_canvas/src/main/res/layout/activity_canvas_client.xml rename to code8_canvas_draw/src/main/res/layout/activity_canvas_client.xml diff --git a/code8_canvas/src/main/res/layout/activity_canvas_clock.xml b/code8_canvas_draw/src/main/res/layout/activity_canvas_clock.xml similarity index 100% rename from code8_canvas/src/main/res/layout/activity_canvas_clock.xml rename to code8_canvas_draw/src/main/res/layout/activity_canvas_clock.xml diff --git a/code8_canvas/src/main/res/layout/activity_canvas_heart.xml b/code8_canvas_draw/src/main/res/layout/activity_canvas_heart.xml similarity index 100% rename from code8_canvas/src/main/res/layout/activity_canvas_heart.xml rename to code8_canvas_draw/src/main/res/layout/activity_canvas_heart.xml diff --git a/code8_canvas/src/main/res/layout/activity_common_operator.xml b/code8_canvas_draw/src/main/res/layout/activity_common_operator.xml similarity index 100% rename from code8_canvas/src/main/res/layout/activity_common_operator.xml rename to code8_canvas_draw/src/main/res/layout/activity_common_operator.xml diff --git a/code8_canvas/src/main/res/layout/activity_common_list.xml b/code8_canvas_draw/src/main/res/layout/activity_draw_list.xml similarity index 58% rename from code8_canvas/src/main/res/layout/activity_common_list.xml rename to code8_canvas_draw/src/main/res/layout/activity_draw_list.xml index 0764bf0..3133d6f 100644 --- a/code8_canvas/src/main/res/layout/activity_common_list.xml +++ b/code8_canvas_draw/src/main/res/layout/activity_draw_list.xml @@ -16,27 +16,42 @@ + android:text="0、clip(裁剪)" /> + android:text="1、circle(圆)" /> + android:text="2、oval(椭圆)" /> + android:text="3、line(线)" /> + android:text="4、arc(弧)" /> + + + + + + diff --git a/code8_canvas_draw/src/main/res/layout/activity_text_list.xml b/code8_canvas_draw/src/main/res/layout/activity_text_list.xml new file mode 100644 index 0000000..b30d60f --- /dev/null +++ b/code8_canvas_draw/src/main/res/layout/activity_text_list.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/code8_canvas/src/main/res/values/colors.xml b/code8_canvas_draw/src/main/res/values/colors.xml similarity index 100% rename from code8_canvas/src/main/res/values/colors.xml rename to code8_canvas_draw/src/main/res/values/colors.xml diff --git a/code8_canvas/src/main/res/values/strings.xml b/code8_canvas_draw/src/main/res/values/strings.xml similarity index 100% rename from code8_canvas/src/main/res/values/strings.xml rename to code8_canvas_draw/src/main/res/values/strings.xml diff --git a/lib_base/src/main/res/values/colors.xml b/lib_base/src/main/res/values/colors.xml new file mode 100644 index 0000000..a68b026 --- /dev/null +++ b/lib_base/src/main/res/values/colors.xml @@ -0,0 +1,14 @@ + + + + #ffe6eb + #a6e3e9 + + #ca2374 + #fe9191 + + #ccfe9191 + + #defcfc + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index bb4456f..69eb5cd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,8 @@ include ':app', ':code5_velocitytracker_scroller', ':code6_flowlayout', ':code7_svg', - ':code8_canvas', - ':code9_paint', + ':code8_canvas_clip', +// ':code8_canvas_draw', +// ':code9_paint', ':lib_base'