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

首頁 > 系統 > Android > 正文

Android自定義View實現等級滑動條的實例

2019-10-23 18:30:59
字體:
來源:轉載
供稿:網友

 Android自定義View實現等級滑動條的實例

實現效果圖:

Android,等級滑動條的實現,Android自定義View實現滑動條

思路:

首先繪制直線,然后等分直線繪制點;

繪制點的時候把X值存到集合中。

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

點擊事件down的時候,換小圖片為大圖片。move的時候跟隨手指移動。

up的時候根據此時的X計算最近的集合中的點,然后自動吸附回去。

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);    //等級數量即點的個數    valueCountent=a.getInteger(R.styleable.BeautySeekBarView_valueCountent, 5);    //點的顏色    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);    //滑動過程中的大圖片    bigPic=a.getResourceId(R.styleable.BeautySeekBarView_bigPic, R.drawable.ic_launcher);      //控件的內邊距    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);//繪制點      if(pointList!=null && pointList.size()<valueCountent){      pointList.add(PointX);//把每個點都放入集合中;      }          }    sePoolTH.release();    canvas.drawBitmap(mBitmap, bitmapPointX-bitmapWidth/2, PointY-bitmapHeight/2, null);//繪制拖動的圖片     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);//信號量,解決并發問題  private int valueCountent;//等級點的數量  private int pointColor;  private int lineColor;  private Bitmap mBitmap;  private int bitmapWidth;  private int bitmapHeight;  private float bitmapPointX;  private ArrayList<Float> pointList;//儲存畫出的點的point值  private HashMap<Float, Float> mHashMap;////把差值和listX當做鍵值對保存起來,便于后期找出  private int index=1;//索引  private float mListX;//移動后最小的點  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);    //等級數量即點的個數    valueCountent=a.getInteger(R.styleable.BeautySeekBarView_valueCountent, 5);    //點的顏色    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);    //滑動過程中的大圖片    bigPic=a.getResourceId(R.styleable.BeautySeekBarView_bigPic, R.drawable.ic_launcher);      //控件的內邊距    viewPadding=a.getDimensionPixelSize(R.styleable.BeautySeekBarView_padding, (int) TypedValue.applyDimension(             TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));    a.recycle();        initData();//初始化數據     initPaint();//初始化畫筆    }  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);//繪制點      if(pointList!=null && pointList.size()<valueCountent){      pointList.add(PointX);//把每個點都放入集合中;      }          }    sePoolTH.release();    canvas.drawBitmap(mBitmap, bitmapPointX-bitmapWidth/2, PointY-bitmapHeight/2, null);//繪制拖動的圖片     canvas.drawText(""+index, bitmapPointX, (getHeight() - fontMetrics.ascent - fontMetrics.descent) / 2, textPaint); //繪制文字  }  long startTime = 0;  @Override  public boolean onTouchEvent(MotionEvent event) {               //獲取手指的操作--》按下、移動、松開        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){//如果按下,抬起時間過大才認為是拖動,要執行動畫。           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){//如果按下,抬起時間過大才認為是拖動,要執行動畫。          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當做鍵值對保存起來,便于后期找出       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;  }  //當手指抬起后更新Bitmap的位置  private void updateBitmapUI(float PointX2) {    mListX=updateIndex(PointX2);    //執行動畫       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();  }  //設置等級點的數量  public void pointValueCountent(int countent){    if(countent<2){      valueCountent=2;    }else{      valueCountent=countent;    }    invalidate();  }  //設置默認位置  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();  }  //提供接口回調,獲取索引  private indexListener mListener=null;  public interface indexListener{    void getIndex(int index);  }  public void setIndexListener(indexListener listener){    mListener=listener;  }}

外部調用:

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);     }  });  }

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻江县| 县级市| 灵丘县| 新昌县| 汉阴县| 元氏县| 中山市| 金昌市| 大城县| 布拖县| 阿克苏市| 乐昌市| 德江县| 昔阳县| 威信县| 浪卡子县| 额敏县| 潞西市| 呼玛县| 巩留县| 资溪县| 廊坊市| 南岸区| 富蕴县| 台中县| 汾西县| 龙州县| 措美县| 甘孜县| 噶尔县| 江门市| 杨浦区| 汾西县| 浪卡子县| 贵州省| 桦甸市| 那曲县| 万源市| 延安市| 琼结县| 郧西县|