android 实现数字滑动,中间大,两边小,滑动的过程中,是逐渐变小

本文介绍了如何在Android中实现一种特殊的数字滑动效果,即数字在滑动过程中从中间开始逐渐向两边缩小。主要涉及Android开发技术,使用Java语言,并结合Android Studio进行实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述

QQ视频20221210141233


import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

import java.util.HashMap;

public class ScrollNumberView extends View {
   

    private String TAG = "NumberTouch";
    //要绘制的数字
    private final String[] mNumbers = new String[]{
   "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "15", "20"};

    //新建一个矩形
    private final RectF mCenterRect = new RectF();
    private float mMaxWidth;
    private float mMaxHeight;
//    private final float mRoundRectWidth = ConvertUtil.toPx(135);
//    private final float mRoundRectHeight = ConvertUtil.toPx(135);
//    private final float minuteInterval = ConvertUtil.toPx(35);
//    private final float mNumberInterval = ConvertUtil.toPx(50);

    private final float mRoundRectWidth = toPx(135); // 矩形的宽度
    private final float mRoundRectHeight = toPx(135); // 矩形的高度
    private final float minuteInterval = toPx(35); // 分钟和矩形的间隔

    /**
     * 每个文字的间距
     */
    private final float mNumberInterval = toPx(70);

    private final Paint mPaintCenterRect = new Paint();
    private final Paint mPaintCenterRectLine = new Paint();

    //画笔
    private final Paint mPaintNumber = new Paint();
    private final float mNumberMinSize = 40;
    private final float mNumberMaxSize = 100;
    private final float mSizeRate = 0.23f;

    //选中的数字索引值
    private int mSelectorIndex = 6;
    //mCurrentDx:这个变量是左右滑动的距离
    private float mCurrentDx;
    private final String minute = "分钟";
    private final int[] mColors = new int[]{
   Color.TRANSPARENT, Color.TRANSPARENT, Color.WHITE, Color.TRANSPARENT, Color.TRANSPARENT};
    private float[] positions = new float[]{
   0.1f, 0.1f, 0.5f, 0.8f, 1f};
    private Paint mPaintMinute;

    //保存数字实体类
    private final HashMap<String, Point> mMapPoint = new HashMap<>();
    /**
     * 选中的数字回调监听
     */
    private SelectorListener mSelectorListener;
    private float mMaxWidthNumber = 0f;
    //屏幕宽度,中间的位置
    private float mScreenX = 0f;
    private float mNumberCenterX = 0f;
    //在这里判断手指离开以后,需要重新设置数字坐标
    private boolean isUp = false;


    //手势监听器,手势滑动监听,可以监听左滑,右滑。
    private final GestureDetector mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
   
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
   
        //    Log.d("111333","手势监听器,手势滑动监听,可以监听左滑,右滑。----------------------------打印mCurrentDx="+mCurrentDx);

            //distanceX:这个变量是左右滑动的距离
            mCurrentDx = distanceX;
            //是否停止绘制自定义view
            boolean isStop = false;
            // last number
            if (mSelectorIndex == mNumbers.length - 1) {
   //最后一个数字
                if (distanceX > 0) {
      //用户左滑了
                    //取出最末尾的数字
                    String right = mNumbers[mNumbers.length - 1];
                    //获取数字实体类
                    Point pointRight = getPoint(right)
Android,要实现一个中间两边小的ViewPager滚动效果,通常会使用`ViewPager`配合`PagerAdapter`来管理Fragment,并通过自定义布局或者适配器来设计卡片式的外观。以下是一个简化的步骤: 1. **创建项目结构**: - 在`activity_main.xml`布局文件设置一个`CoordinatorLayout`作为根容器。 - 在`CoordinatorLayout`内添加一个`LinearLayout`作为水平布局,将`android:orientation="horizontal"`属性设为水平方向。 ```xml <androidx.coordinatorlayout.widget.CoordinatorLayout> <LinearLayout android:id="@+id/content_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <!-- 这里将会放ViewPager --> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 2. **创建`PagerAdapter`**: 创建一个自定义的PagerAdapter,比如`MiddleCardPagerAdapter`,它可以根据指定的页面索引来调整显示的fragment大小。 ```java public class MiddleCardPagerAdapter extends FragmentStatePagerAdapter { private int[] fragmentWidths; // 存储每个Fragment的宽度 public MiddleCardPagerAdapter(FragmentManager fm, int[] fragmentWidths) { super(fm); this.fragmentWidths = fragmentWidths; } @Override public Fragment getItem(int position) { return createFragment(position); } @Override public int getCount() { // 根据需求计算fragment的数量 return fragmentWidths.length; } private Fragment createFragment(int position) { // 实现Fragment并设置其宽度为数组的值 MyFragment myFragment = new MyFragment(); myFragment.setRetainInstance(true); // 保留实例以便于动态修改宽度 View itemView = LayoutInflater.from(context).inflate(R.layout.fragment_card, null); ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) itemView.getLayoutParams(); layoutParams.width = fragmentWidths[position]; itemView.setLayoutParams(layoutParams); return myFragment; } } ``` 3. **设置ViewPager**: 在MainActivity初始化`ViewPager`, 设置Adapter,并监听滑动事件。 ```java ViewPager viewPager = findViewById(R.id.view_pager); MiddleCardPagerAdapter adapter = new MiddleCardPagerAdapter(getSupportFragmentManager(), createFragmentWidthArray()); viewPager.setAdapter(adapter); // 监听滑动,改变中间Fragment的宽度来模拟大小变化 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 0 || position == adapter.getCount() - 1) { // 边缘位置不变 return; } MyFragment middleFragment = (MyFragment) viewPager.findFragmentByTag("middle_fragment"); if (middleFragment != null) { middleFragment.updateWidth(positionOffset); } } // 其他方法... }); ``` 4. **自定义Fragment** (`MyFragment`): `MyFragment`需要包含一个用于更新宽度的方法,并根据传入的值调整视图尺寸。 ```java public class MyFragment extends Fragment { private View mView; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mView = inflater.inflate(R.layout.fragment_card, container, false); // 初始化并添加宽度变化的相关逻辑 return mView; } public void updateWidth(float offset) { // 根据offset百分比调整中间部分的宽度 ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) mView.getLayoutParams(); layoutParams.width = Math.max(minWidth, (int) (mOriginalWidth * (1 + offset))); mView.setLayoutParams(layoutParams); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值