国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android自定義View實(shí)現(xiàn)等級(jí)滑動(dòng)條的實(shí)例

2019-12-12 03:03:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 Android自定義View實(shí)現(xiàn)等級(jí)滑動(dòng)條的實(shí)例

實(shí)現(xiàn)效果圖:

思路:

首先繪制直線,然后等分直線繪制點(diǎn);

繪制點(diǎn)的時(shí)候把X值存到集合中。

然后繪制背景圖片,以及圖片上的數(shù)字。

點(diǎn)擊事件down的時(shí)候,換小圖片為大圖片。move的時(shí)候跟隨手指移動(dòng)。

up的時(shí)候根據(jù)此時(shí)的X計(jì)算最近的集合中的點(diǎn),然后自動(dòng)吸附回去。

1,自定義屬性

<?xml version="1.0" encoding="utf-8"?><resources>   <declare-styleable name="BeautySeekBarView">     <attr name="valueCountent" format="integer"/>      <attr name="padding" format="dimension"/>       <attr name="pointColor" format="color"/>     <attr name="lineColor" format="color"/>    <attr name="smallPic" format="reference"/>     <attr name="bigPic" format="reference"/>    </declare-styleable> </resources>

然后獲取屬性:

 /**      * 獲得我們所定義的自定義樣式屬性      */     TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.BeautySeekBarView, defStyleAttr, 0);    //等級(jí)數(shù)量即點(diǎn)的個(gè)數(shù)    valueCountent=a.getInteger(R.styleable.BeautySeekBarView_valueCountent, 5);    //點(diǎn)的顏色    pointColor = a.getColor(R.styleable.BeautySeekBarView_pointColor, Color.WHITE);     //線的顏色    lineColor = a.getColor(R.styleable.BeautySeekBarView_lineColor, Color.WHITE);    //小圖片    smallPic=a.getResourceId(R.styleable.BeautySeekBarView_smallPic, R.drawable.ic_launcher);    //滑動(dòng)過(guò)程中的大圖片    bigPic=a.getResourceId(R.styleable.BeautySeekBarView_bigPic, R.drawable.ic_launcher);      //控件的內(nèi)邊距    viewPadding=a.getDimensionPixelSize(R.styleable.BeautySeekBarView_padding, (int) TypedValue.applyDimension(             TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));    a.recycle();    

2.繪制

@Override  protected void onDraw(Canvas canvas) {    // TODO Auto-generated method stub    super.onDraw(canvas);    float PointX = 0;    float PointY=getHeight()/2;       canvas.drawLine(0+getPaddingLeft(),PointY, getWidth()-getPaddingRight(), PointY, linePaint); //繪制直線    int averageLength =(getWidth()-getPaddingLeft()-getPaddingRight())/(valueCountent-1);    for(int i=0;i<valueCountent;i++){      PointX=i*averageLength+getPaddingLeft();      canvas.drawPoint(PointX, PointY, pointPaint);//繪制點(diǎn)      if(pointList!=null && pointList.size()<valueCountent){      pointList.add(PointX);//把每個(gè)點(diǎn)都放入集合中;      }          }    sePoolTH.release();    canvas.drawBitmap(mBitmap, bitmapPointX-bitmapWidth/2, PointY-bitmapHeight/2, null);//繪制拖動(dòng)的圖片     canvas.drawText(""+index, bitmapPointX, (getHeight() - fontMetrics.ascent - fontMetrics.descent) / 2, textPaint); //繪制文字  }

全部代碼如下

import java.util.ArrayList;import java.util.HashMap;import java.util.concurrent.Semaphore;import android.R.integer;import android.animation.ValueAnimator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetricsInt;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.MotionEvent;import android.view.View;public class BeautySeekBarView extends View {  private Semaphore sePoolTH=new Semaphore(0);//信號(hào)量,解決并發(fā)問(wèn)題  private int valueCountent;//等級(jí)點(diǎn)的數(shù)量  private int pointColor;  private int lineColor;  private Bitmap mBitmap;  private int bitmapWidth;  private int bitmapHeight;  private float bitmapPointX;  private ArrayList<Float> pointList;//儲(chǔ)存畫(huà)出的點(diǎn)的point值  private HashMap<Float, Float> mHashMap;////把差值和listX當(dāng)做鍵值對(duì)保存起來(lái),便于后期找出  private int index=1;//索引  private float mListX;//移動(dòng)后最小的點(diǎn)  private int smallPic;  private int bigPic;  private int viewPadding;   private Paint pointPaint;  private Paint linePaint;  private Paint textPaint;  private FontMetricsInt fontMetrics;  public BeautySeekBarView(Context context) {    this(context,null);     }  public BeautySeekBarView(Context context, AttributeSet attrs) {    this(context, attrs,0);     }  public BeautySeekBarView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);             /**      * 獲得我們所定義的自定義樣式屬性      */     TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.BeautySeekBarView, defStyleAttr, 0);    //等級(jí)數(shù)量即點(diǎn)的個(gè)數(shù)    valueCountent=a.getInteger(R.styleable.BeautySeekBarView_valueCountent, 5);    //點(diǎn)的顏色    pointColor = a.getColor(R.styleable.BeautySeekBarView_pointColor, Color.WHITE);     //線的顏色    lineColor = a.getColor(R.styleable.BeautySeekBarView_lineColor, Color.WHITE);    //小圖片    smallPic=a.getResourceId(R.styleable.BeautySeekBarView_smallPic, R.drawable.ic_launcher);    //滑動(dòng)過(guò)程中的大圖片    bigPic=a.getResourceId(R.styleable.BeautySeekBarView_bigPic, R.drawable.ic_launcher);      //控件的內(nèi)邊距    viewPadding=a.getDimensionPixelSize(R.styleable.BeautySeekBarView_padding, (int) TypedValue.applyDimension(             TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));    a.recycle();        initData();//初始化數(shù)據(jù)     initPaint();//初始化畫(huà)筆    }  public void initData() {//   valueCountent=7;//   pointColor=Color.WHITE;//   lineColor=Color.WHITE;     //   setBackgroundColor(Color.BLACK);        setPadding(viewPadding, viewPadding, viewPadding, viewPadding);    bitmapPointX=getPaddingLeft();    mBitmap=BitmapFactory.decodeResource(getResources(), smallPic);    bitmapWidth=mBitmap.getWidth();    bitmapHeight=mBitmap.getHeight();    pointList=new ArrayList<Float>();    mHashMap=new HashMap<Float, Float>();  }  public void initPaint() {    pointPaint=new Paint();    pointPaint.setColor(pointColor);    pointPaint.setStyle(Paint.Style.FILL);    pointPaint.setStrokeWidth(10);    pointPaint.setStrokeJoin(Paint.Join.ROUND);    pointPaint.setStrokeCap(Paint.Cap.ROUND);    pointPaint.setAntiAlias(true);     linePaint=new Paint();    linePaint.setColor(lineColor);    linePaint.setStyle(Paint.Style.STROKE);    linePaint.setStrokeWidth(4);    linePaint.setAntiAlias(true);     textPaint=new Paint();    textPaint.setStrokeWidth(3);      textPaint.setTextSize(24);      textPaint.setColor(Color.WHITE);     textPaint.setTextAlign(Paint.Align.CENTER);        fontMetrics = textPaint.getFontMetricsInt();     textPaint.setAntiAlias(true);   }@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  // TODO Auto-generated method stub  super.onMeasure(widthMeasureSpec, heightMeasureSpec);}  @Override  protected void onDraw(Canvas canvas) {    // TODO Auto-generated method stub    super.onDraw(canvas);    float PointX = 0;    float PointY=getHeight()/2;       canvas.drawLine(0+getPaddingLeft(),PointY, getWidth()-getPaddingRight(), PointY, linePaint); //繪制直線    int averageLength =(getWidth()-getPaddingLeft()-getPaddingRight())/(valueCountent-1);    for(int i=0;i<valueCountent;i++){      PointX=i*averageLength+getPaddingLeft();      canvas.drawPoint(PointX, PointY, pointPaint);//繪制點(diǎn)      if(pointList!=null && pointList.size()<valueCountent){      pointList.add(PointX);//把每個(gè)點(diǎn)都放入集合中;      }          }    sePoolTH.release();    canvas.drawBitmap(mBitmap, bitmapPointX-bitmapWidth/2, PointY-bitmapHeight/2, null);//繪制拖動(dòng)的圖片     canvas.drawText(""+index, bitmapPointX, (getHeight() - fontMetrics.ascent - fontMetrics.descent) / 2, textPaint); //繪制文字  }  long startTime = 0;  @Override  public boolean onTouchEvent(MotionEvent event) {               //獲取手指的操作--》按下、移動(dòng)、松開(kāi)        int action = event.getAction();        switch (action) {        case MotionEvent.ACTION_DOWN:            startTime=System.currentTimeMillis();          mBitmap=BitmapFactory.decodeResource(getResources(), bigPic);          bitmapWidth=mBitmap.getWidth();          bitmapHeight=mBitmap.getHeight();          textPaint.setTextSize(30);           //invalidate();          break;               case MotionEvent.ACTION_MOVE:                  long endTimeMove=System.currentTimeMillis();                  if(endTimeMove-startTime>100){//如果按下,抬起時(shí)間過(guò)大才認(rèn)為是拖動(dòng),要執(zhí)行動(dòng)畫(huà)。           bitmapPointX=event.getX();           updateIndex(bitmapPointX);           invalidate();          }          break;        case MotionEvent.ACTION_UP:          long endTime=System.currentTimeMillis();          bitmapPointX=event.getX();          mBitmap=BitmapFactory.decodeResource(getResources(),smallPic);          bitmapWidth=mBitmap.getWidth();          bitmapHeight=mBitmap.getHeight();          textPaint.setTextSize(24);                       if(endTime-startTime>200){//如果按下,抬起時(shí)間過(guò)大才認(rèn)為是拖動(dòng),要執(zhí)行動(dòng)畫(huà)。          updateBitmapUI(bitmapPointX);          }else{                       bitmapPointX=updateIndex(bitmapPointX);            invalidate();          }          startTime = 0;          break;        }        return true;  }  //更新索引  public float updateIndex(float pointX){    float lastValue=100000;    float currentValue=0;    float minValue=0;     for(float listX:pointList){       currentValue= Math.abs(pointX-listX);       mHashMap.put(currentValue, listX);//把差值和listX當(dāng)做鍵值對(duì)保存起來(lái),便于后期找出       minValue=Math.min(lastValue,currentValue);       lastValue=minValue;      }          if(mHashMap.containsKey(minValue)){      mListX=mHashMap.get(minValue);    }else{      Log.e("BeautySeekBarView", "updateBitmapUI--->mHashMap.containsKey(minValue) is null");      return -1;    }     if(pointList.contains(mListX)){    index=pointList.indexOf(mListX)+1;    if(mListener!=null){      mListener.getIndex(index);    }    }else{      Log.e("BeautySeekBarView", "updateBitmapUI--->pointList.contains(mListX) is null");        return -1;    }    return mListX;  }  //當(dāng)手指抬起后更新Bitmap的位置  private void updateBitmapUI(float PointX2) {    mListX=updateIndex(PointX2);    //執(zhí)行動(dòng)畫(huà)       ValueAnimator anim = ValueAnimator.ofFloat(PointX2, mListX);    anim.setDuration(50);    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {      @Override      public void onAnimationUpdate(ValueAnimator animation) {        bitmapPointX =(Float) animation.getAnimatedValue();        invalidate();      }    });    anim.start();  }  //設(shè)置等級(jí)點(diǎn)的數(shù)量  public void pointValueCountent(int countent){    if(countent<2){      valueCountent=2;    }else{      valueCountent=countent;    }    invalidate();  }  //設(shè)置默認(rèn)位置  public void setPointLocation(final int location){    new Thread(new Runnable() {      @Override      public void run() {                try {            sePoolTH.acquire();          } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();          }              if(location>0&&pointList!=null&& !pointList.isEmpty()){            bitmapPointX=pointList.get(location-1);            postInvalidate();          }      }    }).start();  }  //提供接口回調(diào),獲取索引  private indexListener mListener=null;  public interface indexListener{    void getIndex(int index);  }  public void setIndexListener(indexListener listener){    mListener=listener;  }}

外部調(diào)用:

XML:

 <com.example.hello.BeautySeekBarView     android:id="@+id/myView"    android:layout_centerVertical="true"    android:layout_width="match_parent"    android:layout_height="100dp"    ws:padding="20dp"         ws:valueCountent="6"       ws:pointColor="#FFFFFF"    ws:lineColor="#FFFFFF"    ws:smallPic="@drawable/beauty_seekbar_point"    ws:bigPic="@drawable/beauty_seekbar_point_big"/>

Java:

@Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);      setContentView(R.layout.activity_main);   initView();    beautySeekBarView.setPointLocation(2) ;    //  }  private void initView() {  mTextView=(TextView) findViewById(R.id.tv);  beautySeekBarView=(BeautySeekBarView) findViewById(R.id.myView);  beautySeekBarView.setIndexListener(new indexListener() {      @Override    public void getIndex(int index) {      mTextView.setText("index="+index);     }  });  }

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永春县| 四子王旗| 保靖县| 崇左市| 承德县| 都江堰市| 沙湾县| 香港| 上虞市| 莱芜市| 社旗县| 蒙城县| 尚志市| 平顺县| 临城县| 滦平县| 瓦房店市| 桂平市| 东宁县| 绥江县| 洮南市| 泽普县| 阿鲁科尔沁旗| 牡丹江市| 香格里拉县| 班玛县| 朔州市| 靖西县| 平乡县| 阳谷县| 边坝县| 宜良县| 华亭县| 汕尾市| 达州市| 项城市| 吉水县| 咸丰县| 称多县| 咸丰县| 霍林郭勒市|