Среда, 12.12.2018, 22:39
Поиск
Никнэйм
Сертификат на никнейм Olelucoye, зарегистрирован на Тимофеев Константин Михайлович
Зарегистрируй свой никнейм
Обратная связь
olelucoye.tk@yandex.ru
Реклама AdSense
Реклама
Друзья сайта
  • Лига медицинского права
  • Гостиница "Зай"
  • FAQ по системе
  • Инструкции для uCoz
  • Главная » Статьи » Андроид разработка

    Кастомный ползунок в виде дуги (аналог SeekBar) Листинги.

    ArcBar.java

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;

    public class ArcBar extends View {
        int sizeX, sizeY, centerX, centerY, offsetX;
        Paint paintArc, paintThumb, paintFill;
        int maxValue = 50;
        int curValue = 20;
        Path pathFill, pathArc, pathThumb;
        Matrix matrixThumb;
        float curX, curY;
        boolean autoHeight = false;
        
        public ArcBar(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
        
        private void init(){
            paintArc  = new Paint(Paint.ANTI_ALIAS_FLAG);
            paintArc.setColor(Color.BLACK);
            paintArc.setStrokeWidth(3);
            paintArc.setStyle(Paint.Style.STROKE);
            paintThumb  = new Paint(Paint.ANTI_ALIAS_FLAG);
            paintThumb.setColor(Color.BLUE);
            paintThumb.setStrokeWidth(2);
            paintThumb.setStyle(Paint.Style.FILL_AND_STROKE);
            paintFill  = new Paint(Paint.ANTI_ALIAS_FLAG);
            paintFill.setColor(Color.GREEN);
            paintFill.setStrokeWidth(7);
            paintFill.setStyle(Paint.Style.STROKE);
            pathArc = new Path();
            pathFill = new Path();
            pathThumb = new Path();
            matrixThumb = new Matrix(); 
        }
        
        public void setMaxValue(int max){
            maxValue = max;
        }
        
        public void setCurValue(int cur){
            curValue = cur;
            if(cur >= maxValue)curValue = maxValue;
        }
        
        public void setAutoHeight(boolean auto){
            autoHeight = auto;
        }
        
        public int getCurValue(){
            return curValue;
        }
        
        private void drawingArc(){
            pathArc.reset();
            pathFill.reset();
            RectF oval = new RectF(offsetX, offsetX, sizeX, sizeY*2);
            pathArc.arcTo(oval, 180, 180);
            pathFill.arcTo(oval, 180, (float) curValue * 180/((float) maxValue));
        }
        
        private void drawingThumb(){
            float angle = (float) curValue * 180/((float) maxValue);
            matrixThumb.reset();
            matrixThumb.setRotate(angle, centerX, centerY);
            pathThumb.reset();
            pathThumb.addCircle(offsetX, sizeY, offsetX/2, Path.Direction.CW);
        }
        
        @Override
        protected void onDraw(Canvas canvas){
            drawingArc();
            drawingThumb();
            pathThumb.transform(matrixThumb);
            canvas.drawPath(pathArc, paintArc);
            canvas.drawPath(pathFill, paintFill);
            canvas.drawPath(pathThumb, paintThumb);
            super.onDraw(canvas);
        }
        
        @Override
        protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
            int w = View.MeasureSpec.getSize(widthMeasureSpec);
            int h = View.MeasureSpec.getSize(heightMeasureSpec);
            int standart;
            if(!autoHeight){
                if(w/2 <= h - w/15){
                    standart = w;
                }else{
                    standart = h*2 - h*2/15;
                }
            }else{standart = w;}
            offsetX = standart/15;
            sizeX = standart-offsetX;
            sizeY = standart/2;
            centerX = standart/2;
            centerY = sizeY;
            if(!autoHeight){
            setMeasuredDimension(w, h);
            }else{setMeasuredDimension(w, w/2 + offsetX);}
            
        }
        
         @Override
            public boolean onTouchEvent(MotionEvent event){
             switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    curX = event.getX();
                    curY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if((curX - event.getX()) >= (sizeX-offsetX)/maxValue){
                        curX = event.getX();
                        curValue = curValue - 1;
                        if(curValue <= 0)curValue = 0;
                        invalidate();
                    }
                    if((curX - event.getX()) <= 0-(sizeX-offsetX)/maxValue){
                        curX = event.getX();
                        curValue = curValue + 1;
                        if(curValue >= maxValue)curValue = maxValue;
                        invalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    
                    break;
                }
                return true;
         }

    }

    activiti_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="ru.olelucoye.arcseek.MainActivity" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <ru.olelucoye.arcseek.ArcBar
                android:id="@+id/arcBar1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#DD7777" />

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onClick"
                android:text="Get Bar Value" />

            <TextView
                android:id="@+id/tvValue"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                 />

        </LinearLayout>

    </RelativeLayout>

    MainActivity.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;

    public class MainActivity extends Activity {
        ArcBar bar;
        TextView tvValue;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bar = (ArcBar) findViewById(R.id.arcBar1);
            bar.setMaxValue(20);
            bar.setCurValue(5);
            bar.setAutoHeight(true);
            tvValue = (TextView) findViewById(R.id.tvValue);
            tvValue.setText(Integer.toString(bar.getCurValue()));
        }
        public void onClick(View v){
            tvValue.setText(Integer.toString(bar.getCurValue()));
        }
    }

    Категория: Андроид разработка | Добавил: Olelucoye (10.03.2015)
    Просмотров: 679
    | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Меню сайта
    Категории раздела
    Андроид разработка [23]
    libGDX [24]
    Мои андроид проекты [6]
    Excel [7]
    Железяки [5]
    Скрипты в блокноте [4]
    Разное [1]
    Форма входа
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Яндекс Метрика
    Яндекс.Метрика