Commit cd6b558e authored by leichao.gao's avatar leichao.gao

update

parent c7b64cf6
...@@ -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"
......
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
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);
}
}
}
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();
}
});
}
}
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 : 1f; // 缩放目标值
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 / 2f);
fragmentView.setPivotY(viewHeight / 2f);
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));
}
}
}
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);
}
}
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
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
<?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
<?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
<?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
...@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment