diff --git a/app/build.gradle b/app/build.gradle
index b22ece5f..f453bf0d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 26
+ compileSdkVersion 32
defaultConfig {
applicationId "com.bigkoo.pickerviewdemo"
minSdkVersion 14
- targetSdkVersion 26
+ targetSdkVersion 32
versionCode 1
versionName "1.0"
}
@@ -27,6 +27,6 @@ dependencies {
implementation project(':pickerview')
// implementation 'com.contrarywind:Android-PickerView:4.1.9'
// implementation 'com.contrarywind:wheelview:4.1.0'
- implementation 'com.android.support:appcompat-v7:26.1.0'
- implementation 'com.google.code.gson:gson:2.7'
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.code.gson:gson:2.9.1'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2d63adce..ce4f2c5b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,6 +9,7 @@
android:theme="@style/AppTheme">
@@ -16,12 +17,15 @@
-
-
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/bigkoo/pickerviewdemo/FragmentTestActivity.java b/app/src/main/java/com/bigkoo/pickerviewdemo/FragmentTestActivity.java
index 44e8174c..6cf31d73 100644
--- a/app/src/main/java/com/bigkoo/pickerviewdemo/FragmentTestActivity.java
+++ b/app/src/main/java/com/bigkoo/pickerviewdemo/FragmentTestActivity.java
@@ -2,10 +2,11 @@
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v7.app.AppCompatActivity;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
public class FragmentTestActivity extends AppCompatActivity {
private FragmentManager mFragmentManager;
diff --git a/app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java b/app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java
index 0278233b..bde3c7e0 100644
--- a/app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java
+++ b/app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java
@@ -5,7 +5,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
diff --git a/app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java b/app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java
index 930a6c5b..d5f12652 100644
--- a/app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java
+++ b/app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java
@@ -4,7 +4,7 @@
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
diff --git a/app/src/main/java/com/bigkoo/pickerviewdemo/TestCircleWheelViewActivity.java b/app/src/main/java/com/bigkoo/pickerviewdemo/TestCircleWheelViewActivity.java
index 1906d93f..9bf4748f 100644
--- a/app/src/main/java/com/bigkoo/pickerviewdemo/TestCircleWheelViewActivity.java
+++ b/app/src/main/java/com/bigkoo/pickerviewdemo/TestCircleWheelViewActivity.java
@@ -1,8 +1,8 @@
package com.bigkoo.pickerviewdemo;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
import android.widget.Toast;
import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
@@ -25,7 +25,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
setContentView(R.layout.activity_test_circle_wheelview);
WheelView wheelView = findViewById(R.id.wheelview);
- wheelView.setTextSize(20);
+ wheelView.setTextSizeDp(20);
wheelView.setLineSpacingMultiplier(2f);
// wheelView.setDividerWidth(6);
wheelView.setDividerType(WheelView.DividerType.CIRCLE);
diff --git a/app/src/main/java/com/bigkoo/pickerviewdemo/TestFragment.java b/app/src/main/java/com/bigkoo/pickerviewdemo/TestFragment.java
index 56b7d2a5..7b5a4448 100644
--- a/app/src/main/java/com/bigkoo/pickerviewdemo/TestFragment.java
+++ b/app/src/main/java/com/bigkoo/pickerviewdemo/TestFragment.java
@@ -3,8 +3,10 @@
import android.graphics.Color;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/build.gradle b/build.gradle
index 595c3eab..808cc6dd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -9,9 +9,9 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.1'
+ classpath 'com.android.tools.build:gradle:7.2.2'
// classpath "com.novoda:bintray-release:0.9.1"
- classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
+ //classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
diff --git a/gradle.properties b/gradle.properties
index 1d3591c8..2a8e7cc6 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,4 +15,6 @@
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
\ No newline at end of file
+# org.gradle.parallel=true
+android.enableJetifier=false
+android.useAndroidX=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 70da1afe..40d9eebc 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
diff --git a/pickerview/build.gradle b/pickerview/build.gradle
index 9f398512..f8adf5e0 100644
--- a/pickerview/build.gradle
+++ b/pickerview/build.gradle
@@ -1,15 +1,15 @@
apply plugin: 'com.android.library'
-apply plugin: 'com.github.dcendents.android-maven'
+//apply plugin: 'com.github.dcendents.android-maven'
//apply plugin: 'com.novoda.bintray-release'//添加JCenter插件
android {
- compileSdkVersion 26
+ compileSdkVersion 32
defaultConfig {
minSdkVersion 14
- targetSdkVersion 26
+ targetSdkVersion 32
versionCode 34
versionName "4.1.9"
}
@@ -46,5 +46,5 @@ dependencies {
// compile fileTree(include: ['*.jar'], dir: 'libs')
api project(path: ':wheelview')
// api 'com.contrarywind:wheelview:4.1.0'
- implementation 'com.android.support:support-annotations:28.0.0'
+ implementation 'androidx.annotation:annotation:1.5.0'
}
\ No newline at end of file
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java b/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java
index 84eaa165..46a9e5ed 100644
--- a/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java
@@ -2,7 +2,7 @@
import android.content.Context;
import android.graphics.Typeface;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
import android.view.View;
import android.view.ViewGroup;
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java b/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java
index 9fcd75ca..d11b93ca 100644
--- a/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java
@@ -1,7 +1,7 @@
package com.bigkoo.pickerview.builder;
import android.content.Context;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
import android.view.View;
import android.view.ViewGroup;
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java b/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java
index 44c85be9..f7be0576 100644
--- a/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java
@@ -95,7 +95,7 @@ public PickerOptions(int buildType) {
public int textSizeSubmitCancel = 17;//确定取消按钮大小
public int textSizeTitle = 18;//标题文字大小
- public int textSizeContent = 18;//内容文字大小
+ public int textSizeContent = 18;//内容文字大小 dp
public int textColorOut = 0xFFa8a8a8; //分割线以外的文字颜色
public int textColorCenter = 0xFF2a2a2a; //分割线之间的文字颜色
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java
index 2313a626..c36f1b7a 100644
--- a/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java
@@ -83,7 +83,8 @@ private void initView(Context context) {
}
private void initWheelTime(LinearLayout timePickerView) {
- wheelTime = new WheelTime(timePickerView, mPickerOptions.type, mPickerOptions.textGravity, mPickerOptions.textSizeContent);
+ wheelTime = new WheelTime(timePickerView, mPickerOptions.type, mPickerOptions.textGravity,
+ mPickerOptions.textSizeContent * timePickerView.getContext().getResources().getDisplayMetrics().density);
if (mPickerOptions.timeSelectChangeListener != null) {
wheelTime.setSelectChangeCallback(new ISelectTimeCallback() {
@Override
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
index 75017a15..3890ca47 100644
--- a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
@@ -216,10 +216,10 @@ public void onItemSelected(int index) {
}
}
- public void setTextContentSize(int textSize) {
- wv_option1.setTextSize(textSize);
- wv_option2.setTextSize(textSize);
- wv_option3.setTextSize(textSize);
+ public void setTextContentSize(float textSize) {
+ wv_option1.setTextSizeDp(textSize);
+ wv_option2.setTextSizeDp(textSize);
+ wv_option3.setTextSizeDp(textSize);
}
private void setLineSpacingMultiplier() {
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
index 9bc45b65..84a5fc41 100755
--- a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
@@ -1,5 +1,6 @@
package com.bigkoo.pickerview.view;
+import androidx.annotation.Px;
import android.view.View;
import com.bigkoo.pickerview.R;
@@ -45,12 +46,13 @@ public class WheelTime {
private int endDay = DEFAULT_END_DAY; //表示31天的
private int currentYear;
- private int textSize;
+ @Px
+ private float textSize;
private boolean isLunarCalendar = false;
private ISelectTimeCallback mSelectChangeCallback;
- public WheelTime(View view, boolean[] type, int gravity, int textSize) {
+ public WheelTime(View view, boolean[] type, int gravity, @Px float textSize) {
super();
this.view = view;
this.type = type;
@@ -571,7 +573,6 @@ private void setReDay(int year_num, int monthNum, int startD, int endD, Listangcyo
+ * @since 2022/12/30
+ */
+public interface IWheelDraw {
+
+ /**
+ * 绘制文本时, 额外需要绘制的东西
+ */
+ void onDrawOnText(WheelView wheelView, Canvas canvas, String text, float textDrawX, float textDrawY, Paint textDrawPaint, int index, Rect textBounds);
+
+}
diff --git a/wheelview/src/main/java/com/contrarywind/adapter/PreviewAdapter.java b/wheelview/src/main/java/com/contrarywind/adapter/PreviewAdapter.java
new file mode 100644
index 00000000..0d9522cb
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/adapter/PreviewAdapter.java
@@ -0,0 +1,36 @@
+package com.contrarywind.adapter;
+
+import java.util.ArrayList;
+
+/**
+ * Email:angcyo@126.com
+ *
+ * @author angcyo
+ * @date 2020/03/12
+ * Copyright (c) 2019 ShenZhen O&M Cloud Co., Ltd. All rights reserved.
+ */
+public class PreviewAdapter implements WheelAdapter {
+
+ private ArrayList itemList = new ArrayList<>();
+
+ public PreviewAdapter() {
+ for (int i = 0; i < 5; i++) {
+ itemList.add("Item " + i);
+ }
+ }
+
+ @Override
+ public int getItemsCount() {
+ return itemList.size();
+ }
+
+ @Override
+ public String getItem(int index) {
+ return itemList.get(index);
+ }
+
+ @Override
+ public int indexOf(String o) {
+ return itemList.indexOf(o);
+ }
+}
diff --git a/wheelview/src/main/java/com/contrarywind/view/WheelView.java b/wheelview/src/main/java/com/contrarywind/view/WheelView.java
index ea7327c7..887d4d32 100644
--- a/wheelview/src/main/java/com/contrarywind/view/WheelView.java
+++ b/wheelview/src/main/java/com/contrarywind/view/WheelView.java
@@ -16,6 +16,10 @@
import android.view.MotionEvent;
import android.view.View;
+import androidx.annotation.Px;
+
+import com.contrarywind.adapter.IWheelDraw;
+import com.contrarywind.adapter.PreviewAdapter;
import com.contrarywind.adapter.WheelAdapter;
import com.contrarywind.interfaces.IPickerViewData;
import com.contrarywind.listener.LoopViewGestureListener;
@@ -53,6 +57,9 @@ public enum DividerType { // 分隔线类型
private boolean isOptions = false;
private boolean isCenterLabel = true;
+ //在item后面 绘制 label
+ private boolean isDrawLabelOnTextBehind = false;
+ private float labelTextXOffset;
// Timer mTimer;
private ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
@@ -65,13 +72,12 @@ public enum DividerType { // 分隔线类型
private WheelAdapter adapter;
private String label;//附加单位
- private int textSize;//选项的文字大小
+ private float textSize;//选项的文字大小
private int maxTextWidth;
private int maxTextHeight;
private int textXOffset;
private float itemHeight;//每行高度
-
private Typeface typeface = Typeface.MONOSPACE;//字体样式,默认是等宽字体
private int textColorOut;
private int textColorCenter;
@@ -131,10 +137,11 @@ public WheelView(Context context) {
public WheelView(Context context, AttributeSet attrs) {
super(context, attrs);
- textSize = getResources().getDimensionPixelSize(R.dimen.pickerview_textsize);//默认大小
+ textSize = getResources().getDimensionPixelOffset(R.dimen.pickerview_textsize);//默认大小
DisplayMetrics dm = getResources().getDisplayMetrics();
float density = dm.density; // 屏幕密度比(0.75/1.0/1.5/2.0/3.0)
+ labelTextXOffset = density * 4;
if (density < 1) {//根据密度不同进行适配
CENTER_CONTENT_OFFSET = 2.4F;
@@ -153,13 +160,28 @@ public WheelView(Context context, AttributeSet attrs) {
textColorCenter = a.getColor(R.styleable.pickerview_wheelview_textColorCenter, 0xFF2a2a2a);
dividerColor = a.getColor(R.styleable.pickerview_wheelview_dividerColor, 0xFFd5d5d5);
dividerWidth = a.getDimensionPixelSize(R.styleable.pickerview_wheelview_dividerWidth, 2);
- textSize = a.getDimensionPixelOffset(R.styleable.pickerview_wheelview_textSize, textSize);
+ textSize = a.getDimension(R.styleable.pickerview_wheelview_textSize, textSize);
lineSpacingMultiplier = a.getFloat(R.styleable.pickerview_wheelview_lineSpacingMultiplier, lineSpacingMultiplier);
+ isLoop = a.getBoolean(R.styleable.pickerview_wheelview_loop, true);
+ isOptions = a.getBoolean(R.styleable.pickerview_wheelview_isOptions, isOptions);
+ isCenterLabel = a.getBoolean(R.styleable.pickerview_wheelview_isCenterLabel, isCenterLabel);
+ initPosition = a.getInt(R.styleable.pickerview_wheelview_initPosition, -1);
+ if (a.hasValue(R.styleable.pickerview_wheelview_label)) {
+ label = a.getString(R.styleable.pickerview_wheelview_label);
+ }
+ isDrawLabelOnTextBehind = a.getBoolean(R.styleable.pickerview_wheelview_isDrawLabelOnTextBehind, isDrawLabelOnTextBehind);
+ if (a.hasValue(R.styleable.pickerview_wheelview_labelTextXOffset)) {
+ labelTextXOffset = a.getDimensionPixelOffset(R.styleable.pickerview_wheelview_labelTextXOffset, (int) labelTextXOffset);
+ }
a.recycle();//回收内存
}
judgeLineSpace();
initLoopView(context);
+
+ if (isInEditMode()) {
+ setAdapter(new PreviewAdapter());
+ }
}
/**
@@ -178,10 +200,8 @@ private void initLoopView(Context context) {
handler = new MessageHandler(this);
gestureDetector = new GestureDetector(context, new LoopViewGestureListener(this));
gestureDetector.setIsLongpressEnabled(false);
- isLoop = true;
totalScrollY = 0;
- initPosition = -1;
initPaints();
}
@@ -268,11 +288,18 @@ public void smoothScroll(ACTION action) {//平滑滚动的实现
}
//停止的时候,位置有偏移,不是全部都能正确停止到中间位置的,这里把文字位置挪回中间去
mFuture = mExecutor.scheduleWithFixedDelay(new SmoothScrollTimerTask(this, mOffset), 0, 10, TimeUnit.MILLISECONDS);
+ isScrollSetting = true;
}
+ /**
+ * 是否正在滚动中
+ */
+ public boolean isScrollSetting = false;
+
public final void scrollBy(float velocityY) {//滚动惯性的实现
cancelFuture();
mFuture = mExecutor.scheduleWithFixedDelay(new InertiaTimerTask(this, velocityY), 0, VELOCITY_FLING, TimeUnit.MILLISECONDS);
+ isScrollSetting = true;
}
public void cancelFuture() {
@@ -297,14 +324,21 @@ public final void setTypeface(Typeface font) {
paintCenterText.setTypeface(typeface);
}
- public final void setTextSize(float size) {
+ public final void setTextSize(@Px float size) {
if (size > 0.0F) {
- textSize = (int) (context.getResources().getDisplayMetrics().density * size);
+ textSize = size;
paintOuterText.setTextSize(textSize);
paintCenterText.setTextSize(textSize);
}
}
+ public final void setTextSizeDp(float size) {
+ if (size > 0.0F) {
+ textSize = context.getResources().getDisplayMetrics().density * size;
+ setTextSize(textSize);
+ }
+ }
+
public final void setCurrentItem(int currentItem) {
//不添加这句,当这个wheelView不可见时,默认都是0,会导致获取到的时间错误
this.selectedItem = currentItem;
@@ -350,6 +384,7 @@ public final int getCurrentItem() {
}
public final void onItemSelected() {
+ isScrollSetting = false;
if (onItemSelectedListener != null) {
postDelayed(new Runnable() {
@Override
@@ -398,7 +433,6 @@ protected void onDraw(Canvas canvas) {
//跟滚动流畅度有关,总滑动距离与每个item高度取余,即并不是一格格的滚动,每个item不一定滚到对应Rect里的,这个item对应格子的偏移值
float itemHeightOffset = (totalScrollY % itemHeight);
-
//绘制中间两条横线
if (dividerType == DividerType.WRAP) {//横线长度仅包裹内容
float startX;
@@ -440,10 +474,16 @@ protected void onDraw(Canvas canvas) {
}
//只显示选中项Label文字的模式,并且Label文字不为空,则进行绘制
- if (!TextUtils.isEmpty(label) && isCenterLabel) {
- //绘制文字,靠右并留出空隙
- int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label);
- canvas.drawText(label, drawRightContentStart - CENTER_CONTENT_OFFSET, centerY, paintCenterText);
+ if (!TextUtils.isEmpty(label)) {
+ if (isDrawLabelOnTextBehind) {
+ //取第0个计算坐标
+ int textWidth = measuredCenterContentStart(getContentText(adapter.getItem(0)));
+ canvas.drawText(label, drawCenterContentStart + labelTextXOffset + textWidth + CENTER_CONTENT_OFFSET, centerY, paintCenterText);
+ } else if (isCenterLabel) {
+ //绘制文字,靠右并留出空隙
+ int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label);
+ canvas.drawText(label, drawRightContentStart - CENTER_CONTENT_OFFSET, centerY, paintCenterText);
+ }
}
// 设置数组中每个元素的值
@@ -481,7 +521,11 @@ protected void onDraw(Canvas canvas) {
//如果是label每项都显示的模式,并且item内容不为空、label 也不为空
if (!isCenterLabel && !TextUtils.isEmpty(label) && !TextUtils.isEmpty(getContentText(showText))) {
- contentText = getContentText(showText) + label;
+ if (isDrawLabelOnTextBehind) {
+ contentText = getContentText(showText);
+ } else {
+ contentText = getContentText(showText) + label;
+ }
} else {
contentText = getContentText(showText);
}
@@ -502,11 +546,13 @@ protected void onDraw(Canvas canvas) {
canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
setOutPaintStyle(offsetCoefficient, angle);
canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
+ drawOnText(canvas, contentText, drawOutContentStart, maxTextHeight, paintOuterText, index);
canvas.restore();
canvas.save();
canvas.clipRect(0, firstLineY - translateY, measuredWidth, (int) (itemHeight));
canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);
canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText);
+ drawOnText(canvas, contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText, index);
canvas.restore();
} else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) {
// 条目经过第二条线
@@ -514,12 +560,14 @@ protected void onDraw(Canvas canvas) {
canvas.clipRect(0, 0, measuredWidth, secondLineY - translateY);
canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);
canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText);
+ drawOnText(canvas, contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText, index);
canvas.restore();
canvas.save();
canvas.clipRect(0, secondLineY - translateY, measuredWidth, (int) (itemHeight));
canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
setOutPaintStyle(offsetCoefficient, angle);
canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
+ drawOnText(canvas, contentText, drawOutContentStart, maxTextHeight, paintOuterText, index);
canvas.restore();
} else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) {
// 中间条目
@@ -527,16 +575,21 @@ protected void onDraw(Canvas canvas) {
//让文字居中
float Y = maxTextHeight - CENTER_CONTENT_OFFSET;//因为圆弧角换算的向下取值,导致角度稍微有点偏差,加上画笔的基线会偏上,因此需要偏移量修正一下
canvas.drawText(contentText, drawCenterContentStart, Y, paintCenterText);
+ drawOnText(canvas, contentText, drawCenterContentStart, Y, paintCenterText, index);
//设置选中项
selectedItem = preCurrentIndex - (itemsVisible / 2 - counter);
} else {
// 其他条目
canvas.save();
canvas.clipRect(0, 0, measuredWidth, (int) (itemHeight));
- canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
+ if (!isInEditMode()) {
+ canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
+ }
setOutPaintStyle(offsetCoefficient, angle);
// 控制文字水平偏移距离
- canvas.drawText(contentText, drawOutContentStart + textXOffset * offsetCoefficient, maxTextHeight, paintOuterText);
+ float x = drawOutContentStart + textXOffset * offsetCoefficient;
+ canvas.drawText(contentText, x, maxTextHeight, paintOuterText);
+ drawOnText(canvas, contentText, x, maxTextHeight, paintOuterText, index);
canvas.restore();
}
canvas.restore();
@@ -546,6 +599,21 @@ protected void onDraw(Canvas canvas) {
}
}
+ /**
+ * 2022-12-30 在绘制文本的同时, 绘制其他元素
+ */
+ private void drawOnText(Canvas canvas, String text, float textDrawX, float textDrawY, Paint textDrawPaint, int index) {
+ if (adapter instanceof IWheelDraw) {
+ Rect textBounds;
+ if (textDrawPaint == paintCenterText) {
+ textBounds = centerContentBounds;
+ } else {
+ textBounds = outContentBounds;
+ }
+ ((IWheelDraw) adapter).onDrawOnText(this, canvas, text, textDrawX, textDrawY, textDrawPaint, index, textBounds);
+ }
+ }
+
//设置文字倾斜角度,透明度
private void setOutPaintStyle(float offsetCoefficient, float angle) {
// 控制文字倾斜角度
@@ -573,7 +641,7 @@ private void reMeasureTextSize(String contentText) {
Rect rect = new Rect();
paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);
int width = rect.width();
- int size = textSize;
+ float size = textSize;
while (width > measuredWidth) {
size--;
//设置2条横线中间的文字大小
@@ -620,8 +688,10 @@ private String getFixNum(int timeNum) {
return timeNum >= 0 && timeNum < 10 ? TIME_NUM[timeNum] : String.valueOf(timeNum);
}
- private void measuredCenterContentStart(String content) {
- Rect rect = new Rect();
+ public Rect centerContentBounds = new Rect();
+
+ private int measuredCenterContentStart(String content) {
+ Rect rect = centerContentBounds;
paintCenterText.getTextBounds(content, 0, content.length(), rect);
switch (mGravity) {
case Gravity.CENTER://显示内容居中
@@ -638,10 +708,13 @@ private void measuredCenterContentStart(String content) {
drawCenterContentStart = measuredWidth - rect.width() - (int) CENTER_CONTENT_OFFSET;
break;
}
+ return rect.width();
}
+ public Rect outContentBounds = new Rect();
+
private void measuredOutContentStart(String content) {
- Rect rect = new Rect();
+ Rect rect = outContentBounds;
paintOuterText.getTextBounds(content, 0, content.length(), rect);
switch (mGravity) {
case Gravity.CENTER:
@@ -675,6 +748,7 @@ public boolean onTouchEvent(MotionEvent event) {
float top = -initPosition * itemHeight;
float bottom = (adapter.getItemsCount() - 1 - initPosition) * itemHeight;
float ratio = 0.25f;
+ float threshold = (itemHeight - maxTextHeight) / 2 + CENTER_CONTENT_OFFSET;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
@@ -690,8 +764,8 @@ public boolean onTouchEvent(MotionEvent event) {
// normal mode。
if (!isLoop) {
- if ((totalScrollY - itemHeight * ratio < top && dy < 0)
- || (totalScrollY + itemHeight * ratio > bottom && dy > 0)) {
+ if ((totalScrollY - itemHeight * ratio < top - threshold && dy < 0)
+ || (totalScrollY + itemHeight * ratio > bottom + threshold && dy > 0)) {
//快滑动到边界了,设置已滑动到边界的标志
totalScrollY -= dy;
isIgnore = true;
@@ -837,4 +911,44 @@ public int getInitPosition() {
public Handler getHandler() {
return handler;
}
+
+ public boolean isOptions() {
+ return isOptions;
+ }
+
+ public void setOptions(boolean options) {
+ isOptions = options;
+ }
+
+ public boolean isCenterLabel() {
+ return isCenterLabel;
+ }
+
+ public void setCenterLabel(boolean centerLabel) {
+ isCenterLabel = centerLabel;
+ }
+
+ public boolean isDrawLabelOnTextBehind() {
+ return isDrawLabelOnTextBehind;
+ }
+
+ public void setDrawLabelOnTextBehind(boolean drawLabelOnTextBehind) {
+ isDrawLabelOnTextBehind = drawLabelOnTextBehind;
+ }
+
+ public float getLabelTextXOffset() {
+ return labelTextXOffset;
+ }
+
+ public void setLabelTextXOffset(float labelTextXOffset) {
+ this.labelTextXOffset = labelTextXOffset;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public float getTextSize() {
+ return textSize;
+ }
}
\ No newline at end of file
diff --git a/wheelview/src/main/res/values/attrs.xml b/wheelview/src/main/res/values/attrs.xml
index e7cae4d3..8aa25572 100644
--- a/wheelview/src/main/res/values/attrs.xml
+++ b/wheelview/src/main/res/values/attrs.xml
@@ -1,16 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file