Brightness Slider : View « UI « Android






Brightness Slider

    
/* 
 * Copyright (C) 2008 OpenIntents.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//package org.openintents.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * BrightnessSlider.
 * 
 * @author Peli, based on API demo code.
 * 
 */
public class ColorSlider extends View {

  /** Default widget width */
  public int defaultWidth;

  /** Default widget height */
  public int defaultHeight;
  
    private Paint mPaint;
    private int mColor1;
    private int mColor2;
    private OnColorChangedListener mListener;

  /**
   * Constructor. This version is only needed for instantiating the object
   * manually (not from a layout XML file).
   * 
   * @param context
   */
  public ColorSlider(Context context) {
    super(context);
    init();
  }

  /**
   * Construct object, initializing with any attributes we understand from a
   * layout file.
   * 
   * These attributes are defined in res/values/attrs.xml .
   * 
   * @see android.view.View#View(android.content.Context,
   *      android.util.AttributeSet, java.util.Map)
   */
  public ColorSlider(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO what happens with inflateParams
    init();
  }

  /**
   * Initializes variables.
   */
  void init() {
    
    mColor1 = 0xFFFFFFFF;
    mColor2 = 0xFF000000;

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.FILL);
  }

    @Override 
    protected void onDraw(Canvas canvas) {
    Shader s = new LinearGradient(0, 0, 0, getHeight(), mColor1, mColor2, Shader.TileMode.CLAMP);
        mPaint.setShader(s);
      
      canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
    }
    

  /**
   * @see android.view.View#measure(int, int)
   */
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec),
        measureHeight(heightMeasureSpec));
  }

  /**
   * Determines the width of this view
   * 
   * @param measureSpec
   *            A measureSpec packed into an int
   * @return The width of the view, honoring constraints from measureSpec
   */
  private int measureWidth(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    if (specMode == MeasureSpec.EXACTLY) {
      // We were told how big to be
      result = specSize;
    } else {
      // Default width:
      result = defaultWidth;
      if (specMode == MeasureSpec.AT_MOST) {
        // Respect AT_MOST value if that was what is called for by
        // measureSpec
        result = Math.min(result, specSize);
      }
    }
    return result;
  }

  /**
   * Determines the height of this view
   * 
   * @param measureSpec
   *            A measureSpec packed into an int
   * @return The height of the view, honoring constraints from measureSpec
   */
  private int measureHeight(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    if (specMode == MeasureSpec.EXACTLY) {
      // We were told how big to be
      result = specSize;
    } else {
      // Default height
      result = defaultHeight;
      if (specMode == MeasureSpec.AT_MOST) {
        // Respect AT_MOST value if that was what is called for by
        // measureSpec
        result = Math.min(result, specSize);
      }
    }
    return result;
  }
    
  public void setColors(int color1, int color2) {
    mColor1 = color1;
    mColor2 = color2;
        
        invalidate();
  }

  public void setOnColorChangedListener(
      OnColorChangedListener colorListener) {
    mListener = colorListener;
  }
    
    private int ave(int s, int d, float p) {
        return s + java.lang.Math.round(p * (d - s));
    }

    private int interpColor(int color1, int color2, float unit) {
        if (unit <= 0) {
            return color1;
        }
        if (unit >= 1) {
            return color2;
        }
        
        float p = unit;

        // now p is just the fractional part [0...1) and i is the index
        int c0 = color1;
        int c1 = color2;
        int a = ave(Color.alpha(c0), Color.alpha(c1), p);
        int r = ave(Color.red(c0), Color.red(c1), p);
        int g = ave(Color.green(c0), Color.green(c1), p);
        int b = ave(Color.blue(c0), Color.blue(c1), p);
        
        return Color.argb(a, r, g, b);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
              
              float unit = (float) y / ((float) getHeight()); 
              
                int newcolor = interpColor(mColor1, mColor2, unit);

              if (mListener != null) {
                mListener.onColorChanged(this, newcolor);
              }
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                
                break;
        }
        return true;
    }
}

/**
 * Interface for notifications of position change of slider.
 * 
 * @author Peli
 */
 interface OnColorChangedListener {

  /**
   * This method is called when the user changed the color.
   * 
   * This works in touch mode, by dragging the along the 
   * color circle with the finger.
   */
  void onColorChanged(View view, int newColor);
  
  /**
   * This method is called when the user clicks the center button.
   * 
   * @param colorcircle
   * @param newColor
   */
  void onColorPicked(View view, int newColor);
}

   
    
    
    
  








Related examples in the same category

1.extends View to do drawing
2.Set View background
3.Extends View to draw
4.extends View to create customized User interface widget
5.Render View
6.Using Reflection to call method
7.Example of how to write a custom subclass of View.
8.Demonstrates making a view VISIBLE, INVISIBLE and GONE
9.Pint View
10.Compass View
11.Bars View
12.Graph View
13.View inflate