From 3765154f60960a43a8a7d84029a9d97b875fb2b5 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 9 Mar 2025 11:26:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=99=BE=E5=88=86=E6=AF=94?= =?UTF-8?q?=E6=8B=89=E5=8A=A8seekbar=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aes/build.gradle | 4 +- aes/build.properties | 4 +- libaes/build.gradle | 4 +- libaes/build.properties | 4 +- .../unittests/TestViewPageFragment.java | 26 +++- .../studio/libaes/views/AOHPCTCSeekBar.java | 117 ++++++++++++++---- libaes/src/main/res/drawable/ic_call.xml | 11 ++ .../src/main/res/layout/fragment_viewpage.xml | 92 ++++++++------ 8 files changed, 195 insertions(+), 67 deletions(-) create mode 100644 libaes/src/main/res/drawable/ic_call.xml diff --git a/aes/build.gradle b/aes/build.gradle index d3c1e77..a81e6ad 100644 --- a/aes/build.gradle +++ b/aes/build.gradle @@ -76,6 +76,6 @@ dependencies { implementation 'androidx.fragment:fragment:1.1.0' implementation 'com.google.android.material:material:1.4.0' - implementation 'cc.winboll.studio:libappbase:2.1.3' - implementation 'cc.winboll.studio:libapputils:9.4.2' + implementation 'cc.winboll.studio:libappbase:2.1.5' + implementation 'cc.winboll.studio:libapputils:9.4.4' } diff --git a/aes/build.properties b/aes/build.properties index 11cd620..c78882a 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 08 04:21:32 HKT 2025 +#Sun Mar 09 03:25:41 GMT 2025 stageCount=7 libraryProject=libaes baseVersion=7.6 publishVersion=7.6.6 -buildCount=0 +buildCount=66 baseBetaVersion=7.6.7 diff --git a/libaes/build.gradle b/libaes/build.gradle index d694f70..447b1b2 100644 --- a/libaes/build.gradle +++ b/libaes/build.gradle @@ -51,6 +51,6 @@ dependencies { implementation 'androidx.fragment:fragment:1.1.0' implementation 'com.google.android.material:material:1.4.0' - implementation 'cc.winboll.studio:libappbase:2.1.3' - implementation 'cc.winboll.studio:libapputils:9.4.2' + implementation 'cc.winboll.studio:libappbase:2.1.5' + implementation 'cc.winboll.studio:libapputils:9.4.4' } diff --git a/libaes/build.properties b/libaes/build.properties index 988785e..c78882a 100644 --- a/libaes/build.properties +++ b/libaes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 08 04:21:16 HKT 2025 +#Sun Mar 09 03:25:41 GMT 2025 stageCount=7 libraryProject=libaes baseVersion=7.6 publishVersion=7.6.6 -buildCount=0 +buildCount=66 baseBetaVersion=7.6.7 diff --git a/libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestViewPageFragment.java b/libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestViewPageFragment.java index 290ee9d..a86e697 100644 --- a/libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestViewPageFragment.java +++ b/libaes/src/main/java/cc/winboll/studio/libaes/unittests/TestViewPageFragment.java @@ -19,10 +19,13 @@ import cc.winboll.studio.libaes.R; import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; import java.util.ArrayList; import java.util.List; +import cc.winboll.studio.libappbase.LogView; public class TestViewPageFragment extends Fragment implements ViewPager.OnPageChangeListener, View.OnClickListener { public static final String TAG = "TestViewPageFragment"; + + LogView mLogView; private ViewPager viewPager; private List views; //用来存放放进ViewPager里面的布局 @@ -36,6 +39,9 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mView = inflater.inflate(R.layout.fragment_viewpage, container, false); + + mLogView = mView.findViewById(R.id.logview); + mLogView.start(); //viewPager = findViewById(R.id.activitymainViewPager1); initData(); @@ -60,6 +66,7 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh initPoint();//初始化页面下方的点 viewPager.setOnPageChangeListener(this); initAOHPCTCSeekBar(); + initAOHPCTCSeekBar2(); } //初始化所要显示的布局 @@ -187,7 +194,9 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh void initAOHPCTCSeekBar() { AOHPCTCSeekBar seekbar = mView.findViewById(R.id.fragmentviewpageAOHPCTCSeekBar1); seekbar.setThumb(getActivity().getDrawable(R.drawable.ic_launcher)); - seekbar.setThumbOffset(10); + //seekbar.setThumbOffset(200); + //seekbar.setThumbOffset(1); + seekbar.setBlurRightDP(50); seekbar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() { @Override @@ -196,4 +205,19 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh } }); } + + void initAOHPCTCSeekBar2() { + AOHPCTCSeekBar seekbar = mView.findViewById(R.id.fragmentviewpageAOHPCTCSeekBar2); + seekbar.setThumb(getActivity().getDrawable(R.drawable.ic_call)); + //seekbar.setThumbOffset(200); + //seekbar.setThumbOffset(1); + seekbar.setBlurRightDP(50); + seekbar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() { + + @Override + public void onOHPCommit() { + Toast.makeText(getActivity(), "onOHPCommit 2", Toast.LENGTH_SHORT).show(); + } + }); + } } diff --git a/libaes/src/main/java/cc/winboll/studio/libaes/views/AOHPCTCSeekBar.java b/libaes/src/main/java/cc/winboll/studio/libaes/views/AOHPCTCSeekBar.java index fc17539..7ba3d3f 100644 --- a/libaes/src/main/java/cc/winboll/studio/libaes/views/AOHPCTCSeekBar.java +++ b/libaes/src/main/java/cc/winboll/studio/libaes/views/AOHPCTCSeekBar.java @@ -6,18 +6,28 @@ package cc.winboll.studio.libaes.views; * @Describe AOneHundredPercantClickToCommitSeekBar */ import android.content.Context; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.SeekBar; +import cc.winboll.studio.libappbase.LogUtils; public class AOHPCTCSeekBar extends SeekBar { public static final String TAG = "AOHPCTCSeekBar"; + Context mContext; + + int thumbWidth = 1; + int progressBarWidth = 1; + // 设置按钮模糊右边边缘像素 + int blurRightDP = 1; + // 可开始拉动的起始位置(百分比值) - static final int ENABLE_POST_PERCENT_X = 20; + //static final int ENABLE_POST_PERCENT_X = 20; + //int seekablePosition; // 最小拉动值,滑块拉动值要超过这个值,确定事件才会提交。 - static final int TO_MIN_VALUE = 15; + //static final int TO_MIN_VALUE = 15; // 外部接口对象,确定事件提交会调用该对象的方法 OnOHPCListener mOnOHPCListener; // 是否从起点拉动的标志 @@ -25,6 +35,10 @@ public class AOHPCTCSeekBar extends SeekBar { // 拉动的滑动值 int mnTo = 0; + public void setBlurRightDP(int blurRight) { + this.blurRightDP = blurRight; + } + public void setOnOHPCListener(OnOHPCListener listener) { mOnOHPCListener = listener; } @@ -35,10 +49,12 @@ public class AOHPCTCSeekBar extends SeekBar { public AOHPCTCSeekBar(Context context) { super(context); + initView(context); } public AOHPCTCSeekBar(Context context, AttributeSet attrs) { super(context, attrs); + initView(context); //LogUtils.d(TAG, "AOHPCTCSeekBar(...)"); @@ -61,12 +77,23 @@ public class AOHPCTCSeekBar extends SeekBar { public AOHPCTCSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + initView(context); + } + + void initView(Context context) { + LogUtils.d(TAG, "initView(...)"); + mContext = context; +// Drawable thumbDrawable = getThumb(); +// if (thumbDrawable!= null) { +// int iconWidth = thumbDrawable.getIntrinsicWidth(); +// LogUtils.d(TAG, String.format("iconWidth %d", iconWidth)); +// seekablePosition = iconWidth; +// } } @Override protected void onFinishInflate() { super.onFinishInflate(); - } @Override @@ -74,33 +101,52 @@ public class AOHPCTCSeekBar extends SeekBar { if (event.getAction() == MotionEvent.ACTION_DOWN) { //LogUtils.d(TAG, "ACTION_DOWN"); // 有效的拖动起始位置(ENABLE_POST_PERCENT_X)% - int nEnablePostX = ((getRight() - getLeft()) * ENABLE_POST_PERCENT_X / 100) + getLeft(); - - if ((getLeft() < event.getX()) - && (event.getX() < nEnablePostX)) { - //LogUtils.d(TAG, "event.getX() is " + Float.toString(event.getX())); + //int nEnablePostX = ((getRight() - getLeft()) * ENABLE_POST_PERCENT_X / 100) + getLeft(); + //int nEnablePostX = ((getRight() - getLeft()) * seekablePosition / 100) + getLeft(); + /*LogUtils.d(TAG, "event.getX() is " + Float.toString(event.getX())); + LogUtils.d(TAG, String.format("thumbWidth %d progressBarWidth %d", thumbWidth, progressBarWidth)); + LogUtils.d(TAG, String.format("mIsStartTo %s", mIsStartTo)); + */ + if (thumbWidth + blurRightDP > event.getX() && event.getX() > 0) { mIsStartTo = true; - return super.dispatchTouchEvent(event); - } - if (!mIsStartTo) { - resetView(); - return false; + return true; + //return super.dispatchTouchEvent(event); } +// if (!mIsStartTo) { +// resetView(); +// return false; +// } } else if (event.getAction() == MotionEvent.ACTION_MOVE) { //LogUtils.d(TAG, "ACTION_MOVE"); + /*LogUtils.d(TAG, "event.getX() is " + Float.toString(event.getX())); + LogUtils.d(TAG, String.format("thumbWidth %d progressBarWidth %d", thumbWidth, progressBarWidth)); + LogUtils.d(TAG, String.format("mIsStartTo %s", mIsStartTo)); + */ if (mIsStartTo) { - mnTo++; + return super.dispatchTouchEvent(event); + } else { + return false; } - } else if (event.getAction() == MotionEvent.ACTION_UP) { + } else if (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL) { //LogUtils.d(TAG, Integer.toString(getProgress())); // 提交100%确定事件 - if ((getProgress() == 100) && (mnTo > TO_MIN_VALUE)) { - //LogUtils.d(TAG, "Commit mnTo is " + Integer.toString(mnTo)); - mOnOHPCListener.onOHPCommit(); - //resetView(); - //return true; - } - resetView(); +// if (getProgress() == progressBarWidth) { +// //((getProgress() == 100) && (mnTo > TO_MIN_VALUE)) { +// //LogUtils.d(TAG, "Commit mnTo is " + Integer.toString(mnTo)); +// mOnOHPCListener.onOHPCommit(); +// resetView(); +// //return true; +// } else { +// resetView(); +// mIsStartTo = false; +// } +// + if (getProgress() == progressBarWidth) { + mOnOHPCListener.onOHPCommit(); + } + mIsStartTo = false; + resetView(); return false; } //LogUtils.d(TAG, "dispatchTouchEvent End"); @@ -114,4 +160,31 @@ public class AOHPCTCSeekBar extends SeekBar { mnTo = 0; mIsStartTo = false; } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + LogUtils.d(TAG, String.format("width %d height %d", width, height)); + + // 使用width和height进行后续操作 + + // 获取SeekBar的图标 + Drawable thumbDrawable = getThumb(); + if (thumbDrawable != null) { + // 获取图标宽度 + thumbWidth = thumbDrawable.getIntrinsicWidth(); + // 获取进度条宽度 + progressBarWidth = width;//getWidth();// - getPaddingLeft() - getPaddingRight(); + // 计算百分比 + //float percentage = (float) thumbWidth / progressBarWidth * 100; + LogUtils.d(TAG, String.format("thumbWidth %d progressBarWidth %d", thumbWidth, progressBarWidth)); + //LogUtils.d(TAG, String.format("Thumb width / ProgressBar width percentage: %f", percentage)); + + //seekablePosition = (int)percentage; + setThumbOffset(0); + setMax(progressBarWidth); + } + } } diff --git a/libaes/src/main/res/drawable/ic_call.xml b/libaes/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..c5802bb --- /dev/null +++ b/libaes/src/main/res/drawable/ic_call.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/libaes/src/main/res/layout/fragment_viewpage.xml b/libaes/src/main/res/layout/fragment_viewpage.xml index 3e25494..c5efc52 100644 --- a/libaes/src/main/res/layout/fragment_viewpage.xml +++ b/libaes/src/main/res/layout/fragment_viewpage.xml @@ -2,7 +2,7 @@ @@ -12,49 +12,69 @@ android:layout_height="wrap_content" android:text="AOHPCTCSeekBar"/> - + android:gravity="center"> - + - + - + - + - + - + - + + + + + + + + +