仿今日头条亮度调节,字体调节(自定义视图),很好的滑动选择器

菜鸟刚起步的博客!希望会帮助到大家!微笑

滑动选择器参照github:https://github.com/ZhaoKaiQiang/SlideSelectView

通过自己的修改,最后的跟网易效果差不多


具体代码实现:

main方法:

package com.xuxh.slideselectview;

import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.SeekBar;
import android.widget.Toast;

public class MainActivity extends Activity {
    private int defalutValue = 75;
    private SeekBar light_seekBar;
    private SlideSelectView slideSelectView;
    private String[] textStrings;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        light_seekBar = (SeekBar)findViewById(R.id.light_seekBar);
        slideSelectView = (SlideSelectView)findViewById(R.id.slideSelectView);

        light_seekBar.setOnSeekBarChangeListener(seekBarChange);

        textStrings = new String[]{"", "", "", "特大","超大"};
        slideSelectView.setString(textStrings);
        slideSelectView.setOnSelectListener(onSelect);
    }

    private SeekBar.OnSeekBarChangeListener seekBarChange = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            setScreenLight(progress);
        }
    };

    //设置屏幕亮度
    public void setScreenLight(int progress) {
        if (progress < 1) {
            progress = 1;
        } else if (progress > 255) {
            progress = 255;
        }
        final WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.screenBrightness = progress / 255f;
        getWindow().setAttributes(attrs);
        defalutValue = progress;
    }


    private SlideSelectView.onSelectListener onSelect = new SlideSelectView.onSelectListener() {
        @Override
        public void onSelect(int index) {
            Toast.makeText(MainActivity.this,"当前滑动到位置:"+textStrings[index],Toast.LENGTH_SHORT).show();
        }
    };
}

自定义布局 滑动选择器修改后代码

SlideSelectView布局:

package com.xuxh.slideselectview;

import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;

/**
 * Created by xuxinghai on 09/05/16.
 * 设置字体大小专用
 */
public class SlideSelectView extends View {

   //小圆半径
   private static final float RADIU_SMALL = 15;
   //大圆半径
   private static final float RADIU_BIG = 22;
   private static final float RADIU_BIGS = 23;
   //线的高度
   private static float HEIGHT_LINE = 2;
   //线距离两头的边距
// private static float MARGEN_LINE = RADIU_BIG * 3;
   private static float MARGEN_LINE = 33;
   //小圆的数量
   private int countOfSmallCircle;
   //小圆的横坐标
   private float circlesX[];
   private Context mContext;
   //画笔
   private Paint mPaint;
   //文字画笔
   private TextPaint mTextPaint;
   //控件高度
   private float mHeight;
   //控件宽度
   private float mWidth;
   //大圆的横坐标
   private float bigCircleX;
   //是否是手指跟随模式
   private boolean isFollowMode;
   //手指按下的x坐标
   private float startX;
   //文字大小
   private float textSize;
   //文字宽度
   private float textWidth;
   //当前大球距离最近的位置
   private int currentPosition;
   //小圆之间的间距
   private float distanceX;
   //利率文字
   private String[] text4Rates;
   //依附效果实现
   private ValueAnimator valueAnimator;
   //用于纪录松手后的x坐标
   private float currentPositionX;

   private onSelectListener selectListener;


   public SlideSelectView(Context context) {
      this(context, null);
   }

   public SlideSelectView(Context context, AttributeSet attrs) {
      super(context, attrs);
      mContext = context;

      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlideSelectView);
      countOfSmallCircle = a.getInt(R.styleable.SlideSelectView_circleCount, 5);
      textSize = a.getInt(R.styleable.SlideSelectView_sstextSize, (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()));
      a.recycle();

      mPaint = new Paint();
      mPaint.setColor(Color.GRAY);
      mPaint.setAntiAlias(true);

      textSize = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics());

      mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
      mTextPaint.setColor(Color.GRAY);
      mTextPaint.setTextSize(textSize);

      currentPosition = countOfSmallCircle / 2;

   }

   /**
    * 设置显示文本
    *
    * @param strings
    */
   public void setString(String[] strings) {
      text4Rates = strings;
      textWidth = mTextPaint.measureText(text4Rates[0]);

      if (countOfSmallCircle != text4Rates.length) {
         throw new IllegalArgumentException("the count of small circle must be equal to the " +
               "text array length !");
      }

   }

   public int getCurrentPosition() {
      return currentPosition;
   }

   public void setCurrentPosition(int currentPosition) {
      this.currentPosition = currentPosition;
   }

   /**
    * 设置监听器
    *
    * @param listener
    */
   public void setOnSelectListener(onSelectListener listener) {
      selectListener = listener;
   }


   @Override
   protected void onDraw(Canvas canvas) {
      //画中间的线
      mPaint.setStyle(Paint.Style.STROKE);
      mPaint.setStrokeWidth(HEIGHT_LINE);
      canvas.drawLine(MARGEN_LINE, mHeight / 2, mWidth - MARGEN_LINE, mHeight / 2,
            mPaint);


      mPaint.setStyle(Paint.Style.FILL);
      mPaint.setStrokeWidth(HEIGHT_LINE);
      for (int i = 0; i < countOfSmallCircle; i++) {
         canvas.drawLine(circlesX[i], mHeight / 2,circlesX[i], mHeight / 2-12,
               mPaint);
      }


//    //画小圆
//    mPaint.setStyle(Paint.Style.FILL);
//    for (int i = 0; i < countOfSmallCircle; i++) {
//       canvas.drawCircle(circlesX[i], mHeight / 2, RADIU_SMALL, mPaint);
//    }


      //画文字
      canvas.drawText(text4Rates[currentPosition], circlesX[currentPosition] - textWidth / 2,
            (mHeight / 2) - RADIU_BIG -
                  RADIU_SMALL,
            mTextPaint);

      //画大圆的默认位置
      mPaint.setStyle(Paint.Style.FILL);
      mPaint.setStrokeWidth(2);
      mPaint.setColor(Color.WHITE);
      canvas.drawCircle(bigCircleX, mHeight / 2, RADIU_BIG, mPaint);

      //画大圆的默认位置
      mPaint.setStyle(Paint.Style.STROKE);
      mPaint.setStrokeWidth(2);
      mPaint.setColor(Color.GRAY);
      canvas.drawCircle(bigCircleX, mHeight / 2, RADIU_BIGS, mPaint);

   }

   @Override
   public boolean onTouchEvent(MotionEvent event) {

      switch (event.getActionMasked()) {
         case MotionEvent.ACTION_DOWN:

            startX = event.getX();
            //如果手指按下的x坐标与大圆的x坐标的距离小于半径,则是follow模式
            if (Math.abs(startX - bigCircleX) <= RADIU_BIG) {
               isFollowMode = true;
            } else {
               isFollowMode = false;
            }

            break;
         case MotionEvent.ACTION_MOVE:

            //如果是follow模式,则大圆跟随手指移动
            if (isFollowMode) {
               //防止滑出边界
               if (event.getX() >= MARGEN_LINE && event.getX() <= (mWidth - MARGEN_LINE)) {
                  //Log.d("TAG", "event.getX()=" + event.getX() + "__mWidth=" + mWidth);
                  bigCircleX = event.getX();
                  int position = (int) ((event.getX() - MARGEN_LINE) / (distanceX / 2));
                  //更新当前位置
                  currentPosition = (position + 1) / 2;
                  invalidate();
               }

            }

            break;
         case MotionEvent.ACTION_UP:

            if (isFollowMode) {
               float endX = event.getX();
               //当前位置距离最近的小白点的距离
               float currentDistance = endX - MARGEN_LINE - currentPosition * distanceX;

               if ((currentPosition == 0 && currentDistance < 0) || (currentPosition == (text4Rates.length - 1) && currentDistance > 0)) {

                  if (null != selectListener) {
                     selectListener.onSelect(currentPosition);
                  }
                  return true;
               }

               currentPositionX = bigCircleX;

               valueAnimator = ValueAnimator.ofFloat(currentDistance);
               valueAnimator.setInterpolator(new AccelerateInterpolator());
               valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                  @Override
                  public void onAnimationUpdate(ValueAnimator animation) {
                     float slideDistance = (float) animation.getAnimatedValue();
                     bigCircleX = currentPositionX - slideDistance;
                     invalidate();
                  }
               });

               valueAnimator.setDuration(100);
               valueAnimator.start();
               if (null != selectListener) {
                  selectListener.onSelect(currentPosition);
               }
            }

            break;
      }


      return true;
   }

   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
      super.onSizeChanged(w, h, oldw, oldh);
      mHeight = h;
      mWidth = w;
      //计算每个小圆点的x坐标
      circlesX = new float[countOfSmallCircle];
      distanceX = (mWidth - MARGEN_LINE * 2) / (countOfSmallCircle - 1);
      for (int i = 0; i < countOfSmallCircle; i++) {
         circlesX[i] = i * distanceX + MARGEN_LINE;
      }

      bigCircleX = circlesX[currentPosition];
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

      int screenSize[] = getScreenSize((Activity) mContext);

      int resultWidth;
      int widthSize = MeasureSpec.getSize(widthMeasureSpec);
      int widthMode = MeasureSpec.getMode(widthMeasureSpec);

      if (widthMode == MeasureSpec.EXACTLY) {
         resultWidth = widthSize;
      } else {
         resultWidth = screenSize[0];

         if (widthMode == MeasureSpec.AT_MOST) {
            resultWidth = Math.min(widthSize, screenSize[0]);
         }
      }

      int resultHeight;
      int heightSize = MeasureSpec.getSize(heightMeasureSpec);
      int heightMode = MeasureSpec.getMode(heightMeasureSpec);

      if (heightMode == MeasureSpec.EXACTLY) {
         resultHeight = heightSize;
      } else {
         resultHeight = (int) (RADIU_BIG * 6);

         if (heightMode == MeasureSpec.AT_MOST) {
            resultHeight = Math.min(heightSize, resultHeight);
         }
      }

      setMeasuredDimension(resultWidth, resultHeight);

   }

   private static int[] getScreenSize(Activity activity) {
      DisplayMetrics metrics = new DisplayMetrics();
      activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
      return new int[]{metrics.widthPixels, metrics.heightPixels};
   }

   public interface onSelectListener {
      public void onSelect(int index);
   }

}

源码下载地址:http://download.csdn.net/detail/xuxh_6/9515276

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值