Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
B
Browser White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Browser White
Commits
6764a076
Commit
6764a076
authored
Sep 05, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
16b4fb12
cd6b558e
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
445 additions
and
0 deletions
+445
-0
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+6
-0
CustomViewPager.java
...ain/java/com/base/browserwhite/label/CustomViewPager.java
+36
-0
LabelPageTransformer.java
...ava/com/base/browserwhite/label/LabelPageTransformer.java
+30
-0
TestActivity.java
...c/main/java/com/base/browserwhite/label/TestActivity.java
+55
-0
ViewPager2Manager.java
...n/java/com/base/browserwhite/label/ViewPager2Manager.java
+123
-0
ViewPagerAdapter.java
...in/java/com/base/browserwhite/label/ViewPagerAdapter.java
+61
-0
BlueFragment.java
...va/com/base/browserwhite/label/fragment/BlueFragment.java
+32
-0
RedFragment.java
...ava/com/base/browserwhite/label/fragment/RedFragment.java
+47
-0
activity_test_label.xml
app/src/main/res/layout/activity_test_label.xml
+40
-0
fragment_blue.xml
app/src/main/res/layout/fragment_blue.xml
+7
-0
fragment_red.xml
app/src/main/res/layout/fragment_red.xml
+6
-0
dimens.xml
app/src/main/res/values/dimens.xml
+2
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
6764a076
...
@@ -104,6 +104,12 @@
...
@@ -104,6 +104,12 @@
android:launchMode=
"singleTop"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".label.TestActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
<activity
android:name=
".ui.activity.webbrowser.WebBrowserActivity"
android:name=
".ui.activity.webbrowser.WebBrowserActivity"
android:exported=
"true"
android:exported=
"true"
...
...
app/src/main/java/com/base/browserwhite/label/CustomViewPager.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
;
import
android.content.Context
;
import
android.util.AttributeSet
;
import
android.view.MotionEvent
;
import
androidx.viewpager.widget.ViewPager
;
public
class
CustomViewPager
extends
ViewPager
{
private
boolean
isScrollable
=
false
;
public
CustomViewPager
(
Context
context
)
{
super
(
context
);
}
public
CustomViewPager
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
}
public
void
setScrollable
(
boolean
scrollable
)
{
isScrollable
=
scrollable
;
}
@Override
public
boolean
onInterceptTouchEvent
(
MotionEvent
ev
)
{
return
isScrollable
&&
super
.
onInterceptTouchEvent
(
ev
);
}
@Override
public
boolean
onTouchEvent
(
MotionEvent
ev
)
{
return
isScrollable
&&
super
.
onTouchEvent
(
ev
);
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/label/LabelPageTransformer.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
;
import
android.view.View
;
import
androidx.viewpager2.widget.ViewPager2
;
import
com.base.browserwhite.MyApplication
;
import
com.base.browserwhite.utils.Utils
;
public
class
LabelPageTransformer
implements
ViewPager2
.
PageTransformer
{
private
static
final
float
MIN_SCALE
=
0.8f
;
@Override
public
void
transformPage
(
View
page
,
float
position
)
{
if
(
position
<
-
1
)
{
page
.
setAlpha
(
0
);
}
else
if
(
position
<=
0
)
{
page
.
setAlpha
(
1
);
float
n
=
-
page
.
getHeight
()
*
position
+(
position
*
Utils
.
INSTANCE
.
dpToPx
(
MyApplication
.
context
,
100
));
page
.
setTranslationY
(
n
);
}
else
if
(
position
<=
1
)
{
page
.
setAlpha
(
1
-
position
);
float
n
=
page
.
getHeight
()
*
-
position
-
(
Utils
.
INSTANCE
.
dpToPx
(
MyApplication
.
context
,
100
)*
position
);
page
.
setTranslationY
(
n
);
// Keep the page at the same scale
}
else
{
page
.
setAlpha
(
0
);
}
}
}
app/src/main/java/com/base/browserwhite/label/TestActivity.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
;
import
android.os.Bundle
;
import
android.view.View
;
import
android.widget.Button
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.viewpager2.widget.ViewPager2
;
import
com.base.browserwhite.R
;
import
com.base.browserwhite.label.fragment.RedFragment
;
public
class
TestActivity
extends
AppCompatActivity
{
private
ViewPager2
viewPager
;
private
Button
addButton
,
managerButton
,
resetButton
;
private
ViewPager2Manager
mViewPagerManager
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_test_label
);
viewPager
=
findViewById
(
R
.
id
.
viewPager
);
addButton
=
findViewById
(
R
.
id
.
addButton
);
managerButton
=
findViewById
(
R
.
id
.
managerButton
);
resetButton
=
findViewById
(
R
.
id
.
resetButton
);
// 获取重置按钮
mViewPagerManager
=
new
ViewPager2Manager
(
viewPager
,
this
);
addButton
.
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
mViewPagerManager
.
addFragment
();
}
});
managerButton
.
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
mViewPagerManager
.
manageFragments
();
}
});
resetButton
.
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
mViewPagerManager
.
resetFragments
();
}
});
}
}
app/src/main/java/com/base/browserwhite/label/ViewPager2Manager.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
;
import
android.animation.AnimatorSet
;
import
android.animation.ObjectAnimator
;
import
android.util.Log
;
import
android.view.View
;
import
androidx.annotation.NonNull
;
import
androidx.fragment.app.Fragment
;
import
androidx.fragment.app.FragmentActivity
;
import
androidx.recyclerview.widget.ItemTouchHelper
;
import
androidx.recyclerview.widget.RecyclerView
;
import
androidx.viewpager2.widget.ViewPager2
;
import
com.base.browserwhite.R
;
import
com.base.browserwhite.label.fragment.RedFragment
;
public
class
ViewPager2Manager
{
public
ViewPager2
mViewPager
;
public
FragmentActivity
context
;
private
ViewPagerAdapter
viewPagerAdapter
;
public
ViewPager2Manager
(
ViewPager2
viewpager
,
FragmentActivity
context
)
{
this
.
mViewPager
=
viewpager
;
this
.
context
=
context
;
initViewPager
();
}
private
void
initViewPager
(){
viewPagerAdapter
=
new
ViewPagerAdapter
(
context
);
ItemTouchHelper
itemTouchHelper
=
new
ItemTouchHelper
(
new
SwipeToDeleteCallback
());
itemTouchHelper
.
attachToRecyclerView
((
RecyclerView
)
mViewPager
.
getChildAt
(
0
));
mViewPager
.
setPageTransformer
(
new
LabelPageTransformer
());
mViewPager
.
setAdapter
(
viewPagerAdapter
);
Fragment
newFragment
=
new
RedFragment
();
viewPagerAdapter
.
addFragment
(
newFragment
);
Fragment
newFragment1
=
new
RedFragment
();
viewPagerAdapter
.
addFragment
(
newFragment1
);
mViewPager
.
setCurrentItem
(
viewPagerAdapter
.
getItemCount
(),
false
);
}
private
boolean
isScaled
=
false
;
// 标记是否执行了缩放
public
void
manageFragments
()
{
isScaled
=
true
;
for
(
int
i
=
0
;
i
<
viewPagerAdapter
.
getItemCount
();
i
++)
{
Fragment
fragment
=
viewPagerAdapter
.
getItem
(
i
);
View
fragmentView
=
((
RedFragment
)
fragment
).
getCachedView
();
if
(
fragmentView
!=
null
)
{
applyScaleEffect
(
fragmentView
,
true
);
}
}
mViewPager
.
setUserInputEnabled
(
true
);
}
public
void
resetFragments
()
{
isScaled
=
false
;
for
(
int
i
=
0
;
i
<
viewPagerAdapter
.
getItemCount
();
i
++)
{
Fragment
fragment
=
viewPagerAdapter
.
getItem
(
i
);
View
fragmentView
=
((
RedFragment
)
fragment
).
getCachedView
();
if
(
fragmentView
!=
null
)
{
applyScaleEffect
(
fragmentView
,
false
);
}
}
mViewPager
.
setUserInputEnabled
(
false
);
// 禁止滑动
}
public
void
addFragment
(){
Fragment
newFragment
=
new
RedFragment
();
viewPagerAdapter
.
addFragment
(
newFragment
);
mViewPager
.
setOffscreenPageLimit
(
viewPagerAdapter
.
getItemCount
());
mViewPager
.
setCurrentItem
(
viewPagerAdapter
.
getItemCount
()
-
1
,
false
);
if
(
isScaled
)
{
View
fragmentView
=
((
RedFragment
)
newFragment
).
getCachedView
();
if
(
fragmentView
!=
null
)
{
applyScaleEffect
(
fragmentView
,
false
);
}
mViewPager
.
setUserInputEnabled
(
false
);
isScaled
=
false
;
}
}
private
void
applyScaleEffect
(
View
fragmentView
,
boolean
scale
)
{
if
(
fragmentView
!=
null
)
{
float
targetScale
=
scale
?
0.8f
:
1
f
;
// 缩放目标值
ObjectAnimator
scaleXAnimator
=
ObjectAnimator
.
ofFloat
(
fragmentView
,
"scaleX"
,
targetScale
);
ObjectAnimator
scaleYAnimator
=
ObjectAnimator
.
ofFloat
(
fragmentView
,
"scaleY"
,
targetScale
);
float
viewWidth
=
fragmentView
.
getWidth
();
float
viewHeight
=
fragmentView
.
getHeight
();
fragmentView
.
setPivotX
(
viewWidth
/
2
f
);
fragmentView
.
setPivotY
(
viewHeight
/
2
f
);
AnimatorSet
animatorSet
=
new
AnimatorSet
();
animatorSet
.
playTogether
(
scaleXAnimator
,
scaleYAnimator
);
animatorSet
.
setDuration
(
500
);
// 动画持续时间
animatorSet
.
start
();
}
}
private
class
SwipeToDeleteCallback
extends
ItemTouchHelper
.
SimpleCallback
{
public
SwipeToDeleteCallback
()
{
super
(
0
,
ItemTouchHelper
.
LEFT
|
ItemTouchHelper
.
RIGHT
);
}
@Override
public
boolean
onMove
(
@NonNull
RecyclerView
recyclerView
,
@NonNull
RecyclerView
.
ViewHolder
viewHolder
,
@NonNull
RecyclerView
.
ViewHolder
target
)
{
return
false
;
}
@Override
public
void
onSwiped
(
@NonNull
RecyclerView
.
ViewHolder
viewHolder
,
int
direction
)
{
int
position
=
viewHolder
.
getAdapterPosition
();
viewPagerAdapter
.
removeFragment
(
viewPagerAdapter
.
getItem
(
position
));
}
}
}
app/src/main/java/com/base/browserwhite/label/ViewPagerAdapter.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
;
import
android.util.Log
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
androidx.annotation.NonNull
;
import
androidx.fragment.app.Fragment
;
import
androidx.fragment.app.FragmentManager
;
import
androidx.fragment.app.FragmentStatePagerAdapter
;
import
java.util.ArrayList
;
import
java.util.List
;
import
androidx.annotation.NonNull
;
import
androidx.fragment.app.Fragment
;
import
androidx.fragment.app.FragmentActivity
;
import
androidx.fragment.app.FragmentTransaction
;
import
androidx.viewpager2.adapter.FragmentStateAdapter
;
import
androidx.viewpager2.adapter.FragmentViewHolder
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
ViewPagerAdapter
extends
FragmentStateAdapter
{
private
final
List
<
Fragment
>
fragmentList
=
new
ArrayList
<>();
public
ViewPagerAdapter
(
FragmentActivity
activity
)
{
super
(
activity
);
}
@NonNull
@Override
public
Fragment
createFragment
(
int
position
)
{
return
fragmentList
.
get
(
position
);
}
public
void
addFragment
(
Fragment
fragment
)
{
fragmentList
.
add
(
fragment
);
notifyDataSetChanged
();
// 通知数据变化
}
public
void
removeFragment
(
Fragment
fragment
)
{
fragmentList
.
remove
(
fragment
);
notifyDataSetChanged
();
// 通知数据变化
}
@Override
public
int
getItemCount
()
{
return
fragmentList
.
size
();
// 返回 Fragment 列表的大小
}
@NonNull
public
Fragment
getItem
(
int
position
)
{
return
fragmentList
.
get
(
position
);
}
}
app/src/main/java/com/base/browserwhite/label/fragment/BlueFragment.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
.
fragment
;
import
android.os.Bundle
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
androidx.fragment.app.Fragment
;
import
com.base.browserwhite.R
;
public
class
BlueFragment
extends
Fragment
{
private
View
fragmentView
;
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
ViewGroup
container
,
Bundle
savedInstanceState
)
{
fragmentView
=
inflater
.
inflate
(
R
.
layout
.
fragment_blue
,
container
,
false
);
return
fragmentView
;
}
@Override
public
void
onViewCreated
(
View
view
,
Bundle
savedInstanceState
)
{
super
.
onViewCreated
(
view
,
savedInstanceState
);
// 缓存视图
fragmentView
=
view
;
}
public
View
getCachedView
()
{
return
fragmentView
;
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/label/fragment/RedFragment.java
0 → 100644
View file @
6764a076
package
com
.
base
.
browserwhite
.
label
.
fragment
;
import
android.graphics.Color
;
import
android.os.Bundle
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
androidx.fragment.app.Fragment
;
import
com.base.browserwhite.R
;
import
java.util.Random
;
public
class
RedFragment
extends
Fragment
{
private
View
fragmentView
;
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
ViewGroup
container
,
Bundle
savedInstanceState
)
{
fragmentView
=
inflater
.
inflate
(
R
.
layout
.
fragment_red
,
container
,
false
);
int
i
=
new
Random
().
nextInt
();
if
(
i
%
2
==
0
)
{
fragmentView
.
setBackgroundColor
(
Color
.
RED
);
}
else
{
fragmentView
.
setBackgroundColor
(
Color
.
BLUE
);
}
return
fragmentView
;
}
@Override
public
void
onViewCreated
(
View
view
,
Bundle
savedInstanceState
)
{
super
.
onViewCreated
(
view
,
savedInstanceState
);
// 缓存视图
fragmentView
=
view
;
}
public
View
getCachedView
()
{
return
fragmentView
;
}
@Override
public
void
onDestroyView
()
{
super
.
onDestroyView
();
fragmentView
=
null
;
}
}
\ No newline at end of file
app/src/main/res/layout/activity_test_label.xml
0 → 100644
View file @
6764a076
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<androidx.viewpager2.widget.ViewPager2
android:id=
"@+id/viewPager"
android:layout_width=
"match_parent"
android:orientation=
"vertical"
android:layout_height=
"0dp"
android:layout_gravity=
"center"
android:layout_weight=
"1"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<Button
android:id=
"@+id/addButton"
android:layout_weight=
"1"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Add"
/>
<Button
android:layout_weight=
"1"
android:id=
"@+id/managerButton"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Manager"
/>
<Button
android:layout_weight=
"1"
android:id=
"@+id/resetButton"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"reset"
/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_blue.xml
0 → 100644
View file @
6764a076
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_gravity=
"center"
android:background=
"#000000"
>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_red.xml
0 → 100644
View file @
6764a076
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_gravity=
"center"
android:layout_height=
"match_parent"
android:background=
"#FF0000"
/>
\ No newline at end of file
app/src/main/res/values/dimens.xml
View file @
6764a076
...
@@ -46,4 +46,6 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
...
@@ -46,4 +46,6 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
<dimen
name=
"dp_45"
>
45dp
</dimen>
<dimen
name=
"dp_45"
>
45dp
</dimen>
<dimen
name=
"dp_35"
>
35dp
</dimen>
<dimen
name=
"dp_35"
>
35dp
</dimen>
<dimen
name=
"dp_146"
>
146dp
</dimen>
<dimen
name=
"dp_146"
>
146dp
</dimen>
<dimen
name=
"fragment_overlap_distance"
>
-500dp
</dimen>
</resources>
</resources>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment