亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

一個類似Tabs的控件SegmentControl

系統(tǒng) 1976 0
一個類似Tabs的控件SegmentControl
    
package com.ql.view;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;

public class SegmentControl extends LinearLayout {

	private Map<Integer,IButton> indexButtonMap = new HashMap<Integer, IButton>();
	private Map<IButton,Integer> buttonIndexMap = new HashMap<IButton, Integer>();
	
	private int selectedIndex;
	
	public static final int TAB = 1;
	public static final int SEGMENT = 2;
	
	private int currentStyle = SEGMENT;
	
	private int maxButtonSize;
	private int marginsLeft = 1;
	
	private LayoutParams  layoutMarginsParams;
	
	private boolean onlyIsPressed;
	private OnSegmentChangedListener onSegmentChangedListener;
	
	public SegmentControl(Context context, AttributeSet attrs) {
		super(context,attrs);
		
		this.setOrientation(HORIZONTAL);
		layoutMarginsParams = new LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT);
		layoutMarginsParams.setMargins(marginsLeft, 0, 0, 0);
	}
	
	public SegmentControl(Context context,int style) {
		super(context,null);
		this.setOrientation(HORIZONTAL);
		currentStyle = style;
		layoutMarginsParams = new LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT);
		layoutMarginsParams.setMargins(marginsLeft, 0, 0, 0);
	}
	
	public void setStyle(int style) {
		
		currentStyle = style;
	}
	
	public void setWidth(int width, int height, int num) {
		
		int itemWidth = width/num;
		
		layoutMarginsParams.width = itemWidth;
		layoutMarginsParams.height = height;
	}
	
	
	public int getButtonCount(){
		return maxButtonSize;
	}
	
	public IButton getButton(int index){
		return indexButtonMap.get(index);
	}
	
	public void setSelectedIndex(int index){
		if(index <= maxButtonSize){
			selectedIndex = index;
			selectButton(index);
		}
	}
	
	public int getSelectedIndex(){
		return selectedIndex;
	}
	
	/**
	 * 廢棄
	 * 請使用setOnSegmentChangedListener代替
	 * @param index
	 * @param l
	 */
	@Deprecated
	public void bindOnChooseListener(int index, IButton.OnChooseListener l){
		indexButtonMap.get(index).setOnChooseListener(l);
	}
	
	public void clearButton() {
		this.removeAllViews();
		maxButtonSize = 0;
	}
	
	public IButton newButton(int drawableId, int id){
		IButton button = new IButton(getContext(), id, IButton.PICTURE);
		button.setLayoutParams(layoutMarginsParams);

		button.setBackgroundResource(drawableId);
		
		postNewButton(button);
		return button;
	}
	
	
	private void postNewButton(IButton button){
		this.addView(button);
		addButtonToMap(button, maxButtonSize);
		maxButtonSize++;
		button.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					selectedIndex = buttonIndexMap.get(v);
					selectButton(selectedIndex);
				}
				return false;
			}
		});
	}
	public IButton newButton(String text, int id){
		IButton button = null;
		if(currentStyle == TAB){
			button = new IButton(getContext(), id, IButton.TAB);
		}else if(currentStyle == SEGMENT){
			if(maxButtonSize == 0){
				button = new IButton(getContext(), id);
			}else{
				button = new IButton(getContext(), id, IButton.SEGMENT_CENTER);
			}
			//只有2個按??
			if(maxButtonSize == 1){
				getButton(0).changeButtonStyle(IButton.SEGMENT_LEFT);
				button.changeButtonStyle(IButton.SEGMENT_RIGHT);
			}
			
			//超過2??
			if(maxButtonSize > 1){
					getButton(0).changeButtonStyle(IButton.SEGMENT_LEFT);
					getButton(maxButtonSize - 1).changeButtonStyle(IButton.SEGMENT_CENTER);
					button.changeButtonStyle(IButton.SEGMENT_RIGHT);
			}
			
		}
		//layoutMarginsParams = new LayoutParams(45, 35);
		button.setLayoutParams(layoutMarginsParams);
		
		//button背景色可以在這里設置
		button.setPressedColor(Color.rgb(16, 38, 55), Color.rgb(16, 38, 55));

		button.setTextSize(16);
		button.setText(text);
		postNewButton(button);
		return button;
	}
	
	private void addButtonToMap(IButton button, int index){
		this.indexButtonMap.put(maxButtonSize, button);
		this.buttonIndexMap.put(button, maxButtonSize);
	}
	
	private void selectButton(int index){
		//1
		if(maxButtonSize == 1){
			IButton button = indexButtonMap.get(0);
			button.onDefaultUp();
				if(!onlyIsPressed){
					button.onDown();
					if(button.hasPressedDrawable()){
						button.setPressedDrawable();
					}
					if(onSegmentChangedListener != null){
						onSegmentChangedListener.onSegmentChanged(button.getCmdId());
					}
					onlyIsPressed = true;
				}else{
					if(button.hasDefaultDrawable()){
						button.setDefaultDrawable();
					}
					button.onUp();
					onlyIsPressed = false;
				}
		//more
		}else{
			for (int i = 0; i < maxButtonSize; i++) {
				IButton button = indexButtonMap.get(i);
				if(i == index){
					if(button.isNormal()){
						button.onDown();
						if(button.hasPressedDrawable()){
							button.setPressedDrawable();
						}
						if(onSegmentChangedListener != null){
							onSegmentChangedListener.onSegmentChanged(button.getCmdId());
						}
					}
				}else{
					if(button.hasDefaultDrawable()){
						button.setDefaultDrawable();
					}
					button.onDefaultUp();
				}
			}
		}

	}
	
	public interface OnSegmentChangedListener{
		public void onSegmentChanged(int index);
	}
	
	public void setOnSegmentChangedListener(OnSegmentChangedListener l){
		this.onSegmentChangedListener = l;
	}
	
}

  

    
package com.ql.view;


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.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;

/**
 */
public class IButton extends Button implements OnTouchListener {
	
	private int	buttonID;
	
	private ShapeDrawable mDrawable;
	
	private boolean isPressed = false;
	private int radian;
	
    float[] DEFAULT_OUTRADII;
    float[] TAB_OUTRADII;
    float[] LEFT_OUTRADII;
    float[] RIGHT_OUTRADII;
    float[] CENTER_OUTRADII;
    private static int DEFAULT_RADIAN = 8;
    
    //#B7B7B7
    private  int DEFAULT_START_COLOR =  -4737097;
    //8F8F8F
    private int DEFAULT_END_COLOR = -7368817;

    //#9F9F9F
    private int PRESSED_START_COLOR = -6316129;
    //#767676
    private int PRESSED_END_COLOR = -9013642;
    
    public static int TAB = 1;
    public static int SEGMENT_LEFT = 2;
    public static int SEGMENT_CENTER = 3;
    public static int SEGMENT_RIGHT = 4;
    public static int DEFAULT = 0;
    public static int PICTURE = 5;
    
    private int style;
    
    private OnChooseListener mOnChooseListener;
    
    /**
     * 默認圖片
     */
    private int defaultDrawableId;
    
    /**
     * 按下圖片
     */
    private int pressedDrawableId;
    
    public boolean hasDefaultDrawable(){
    	if(defaultDrawableId != 0){
    		return true;
    	}else{
    		return false;
    	}
    }
    
    public boolean hasPressedDrawable(){
    	if(pressedDrawableId != 0){
    		return true;
    	}else{
    		return false;
    	}
    }
    
    public void setDefaultDrawableId(int defaultDrawableId){
    	this.defaultDrawableId = defaultDrawableId;
    }
    
    public void setDefaultDrawable(int defaultDrawableId){
    	setDefaultDrawableId(defaultDrawableId);
    	setDefaultDrawable();
    }
    
    public void setDefaultDrawable(){
    	setBackgroundResource(defaultDrawableId);
    }
    
    public void setPressedDrawable(int pressedDrawableId){
    	setPressedDrawableId(pressedDrawableId);
    	setPressedDrawable();
    }
    
    public void setPressedDrawable(){
    	setBackgroundResource(pressedDrawableId);
    }
    
    public void setPressedDrawableId(int pressedDrawableId){
    	this.pressedDrawableId = pressedDrawableId;
    }
    public void setOnChooseListener(IButton.OnChooseListener l){
    	this.mOnChooseListener = l;
    }
	public boolean isNormal(){
		return !isPressed;
	}
	
	public boolean isPressed(){
		return isPressed;
	}
	
	
	public void setRadian(int radian){
		this.radian = radian;
		initRadian();
		changeButtonStyle(style);
	}
	
	
	private void initRadian(){
	    DEFAULT_OUTRADII = new float[] { radian, radian, radian, radian, radian, radian, radian, radian };
	    TAB_OUTRADII = new float[] { radian, radian, radian, radian, 0, 0, 0, 0 };
	    LEFT_OUTRADII = new float[] { radian, radian, 0, 0, 0, 0, radian, radian };
	    RIGHT_OUTRADII = new float[] { 0, 0, radian, radian, radian, radian, 0, 0 };
	    CENTER_OUTRADII = new float[] { 0, 0, 0, 0, 0, 0, 0, 0 };
	}
	/**
	 * 
	 * @param startColor
	 * @param endColor
	 */
	public IButton setNormalColor(int startColor, int endColor){
		this.DEFAULT_START_COLOR = startColor;
		this.DEFAULT_END_COLOR = endColor;
		invalidate();
		return this;
	}
	
	/**
	 * 
	 * @param startColor
	 * @param endColor
	 */
	public IButton setPressedColor(int startColor, int endColor){
		this.PRESSED_START_COLOR = startColor;
		this.PRESSED_END_COLOR = endColor;
		invalidate();
		return this;
	}
	
	private Shader getNormalColor(int width, int height){
		return new LinearGradient(width/2,0,width/2,height,DEFAULT_START_COLOR,DEFAULT_END_COLOR,Shader.TileMode.MIRROR);  
	}
	
	private Shader getPressedColor(int width, int height){
		return new LinearGradient(width/2,0,width/2,height,PRESSED_START_COLOR,  PRESSED_END_COLOR,Shader.TileMode.MIRROR);  
	}
	
	
	public IButton(Context context, int id, int style) {
		super(context,null);
		
		this.buttonID = id;
		init(style);
	}
	
	public IButton(Context context, int id){
		super(context,null);
		
		this.buttonID = id;
		init(DEFAULT);
	}
	
	private void init(int style){
		radian = DEFAULT_RADIAN;
		initRadian();
		if(PICTURE != style){
			if(mDrawable == null){
				mDrawable = getShapeDrawable(style);
			}
			this.getBackground().setAlpha(0);
			this.setTextColor(Color.WHITE);
		}
		this.setOnTouchListener(this);
	}
	
	public IButton(Context context, int id, AttributeSet attrs) {
		super(context,attrs);
		
		this.buttonID = id;
		init(DEFAULT);
	}
	
	public IButton(Context context, int id, ShapeDrawable mDrawable){
		super(context);
		
		this.buttonID = id;
		this.mDrawable = mDrawable;
	}
	
	public int getCmdId() {
		return buttonID;
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
		if(mDrawable != null){
			mDrawable.setBounds(0, 0, this.getWidth(), this.getHeight());
			if(!isPressed){
				mDrawable.getPaint().setShader(getNormalColor(this.getWidth(), this.getHeight()));
			}else{
				mDrawable.getPaint().setShader(getPressedColor(this.getWidth(), this.getHeight()));
			}
			
			//mDrawable.getPaint().setColor(Color.BLUE);
			//mDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
			mDrawable.draw(canvas);
		}

		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setStyle(Paint.Style.STROKE);
		paint.setTextAlign(Align.CENTER);
		paint.setTextSize(getTextSize());
		paint.setColor(Color.WHITE);
		FontMetrics fm = paint.getFontMetrics();
		int y = getTop() + (int)(getHeight() - fm.ascent)/2;
    	canvas.drawText((String)getText(), getWidth()/2, y, paint);
		
	}
	
	public void onDown() {
		onDefaultDown();
		if(mOnChooseListener != null){
			mOnChooseListener.onDown();
		}
	}

	public void onUp() {
		onDefaultUp();
		if(mOnChooseListener != null){
			mOnChooseListener.onUp();
		}
	}
	
	public void onDefaultUp(){
		isPressed = false;
		invalidate();
	}
	
	public void onDefaultDown(){
		isPressed = true;
		invalidate();
	}

	public void changeButtonStyle(int style){
		getShapeDrawable(style);
		invalidate();
	}
	
	private ShapeDrawable getShapeDrawable(int style){
		this.style = style;
		if(style == TAB){
			mDrawable = new ShapeDrawable(new RoundRectShape(TAB_OUTRADII, null,
					null));
		}else if(style == SEGMENT_LEFT){
			mDrawable = new ShapeDrawable(new RoundRectShape(LEFT_OUTRADII, null,
					null));
		}else if(style == SEGMENT_CENTER){
			mDrawable = new ShapeDrawable(new RoundRectShape(CENTER_OUTRADII, null,
					null));
		}else if(style == SEGMENT_RIGHT){
			mDrawable = new ShapeDrawable(new RoundRectShape(RIGHT_OUTRADII, null,
					null));
		}else{
			mDrawable = new ShapeDrawable(new RoundRectShape(DEFAULT_OUTRADII, null,
					null));
		}
		return mDrawable;
	}
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			if (!isPressed) {
				if(hasPressedDrawable()){
					setBackgroundResource(pressedDrawableId);
				}
				// 更改為按下時的背景圖
				onDown();
			}
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			if (isPressed) {
				if(hasDefaultDrawable()){
					setBackgroundResource(defaultDrawableId);
				}
				// 改為抬起時的圖片
				onUp();
			}
		}
		// TODO Auto-generated method stub
		return false;
	}
	
	public interface OnChooseListener{
		public void onDown();
		public void onUp();
	}
}

  

用法:
    
package com.ql.activity;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;

import com.ql.view.SegmentControl;
import com.ql.view.SegmentControl.OnSegmentChangedListener;

public class Test_5_Activity  extends Activity{
	SegmentControl segControl;
	private ViewFlipper	mFlipper;
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.test6);
        
        mFlipper = (ViewFlipper)findViewById(R.id.flipper);
        //測試界面,實際開發(fā)中是從layout中讀取的,下同。
        TextView tv=new TextView(this);
        tv.setText("index=0");
        mFlipper.addView(tv);
//      tv.requestFocus();
        
        segControl = (SegmentControl)findViewById(R.id.segcontrol);
        segControl.setStyle(SegmentControl.TAB);//試試SEGMENT
        segControl.newButton("標題1", 0);
        segControl.newButton("標題2", 1);
        segControl.newButton("標題3", 2);
        segControl.newButton("標題4", 3);
        //還可試試segControl.newButton(int drawableId, int id);
        segControl.setSelectedIndex(0);
        int width = this.px2dip(this, 80*segControl.getButtonCount());
        int height = this.px2dip(this, 38);
        segControl.setWidth(width, height, segControl.getButtonCount());
        
        segControl.setOnSegmentChangedListener(new OnSegmentChangedListener() {
			
			@Override
			public void onSegmentChanged(int index) {
				//
				onChangeView(index);
			}
		});
        
    }
    private int mIndex=0;
    private void changeViewAnimation(int index, View view) {
		if(index == mIndex)
			return;
		
		mFlipper.addView(view);
		
		Animation inAnim = null;
		Animation outAnim = null;

		if(index > mIndex) {
			inAnim = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
			outAnim = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
		} else {
			inAnim = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
			outAnim = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
		}
		inAnim.setDuration(1000);
		outAnim.setDuration(1000);
		
        mFlipper.setInAnimation(inAnim);
        mFlipper.setOutAnimation(outAnim);
        mFlipper.showNext();
        //mFlipper.startFlipping();
        mFlipper.removeViewAt(0);
        
        mIndex = index;
	}
    private void onChangeView(int index) 
	{
        //測試界面,實際開發(fā)中是從layout中讀取的,下同。 
    	TextView tv=new TextView(this);
    	tv.setText("index="+index);
		switch(index){
		case 0:
			Toast.makeText(this, "VIEW_TLINE", Toast.LENGTH_SHORT).show();
			changeViewAnimation(index, tv);
			break;
		case 1:
			Toast.makeText(this, "VIEW_KLINE", Toast.LENGTH_SHORT).show();
			changeViewAnimation(index, tv);
			break;
		case 2:
			Toast.makeText(this, "VIEW_DETAIL", Toast.LENGTH_SHORT).show();
			changeViewAnimation(index, tv);
			break;
		case 3:
			Toast.makeText(this, "VIEW_F10", Toast.LENGTH_SHORT).show();
			changeViewAnimation(index, tv);
			break;
		case 4:
			Toast.makeText(this, "VIEW_RADAR", Toast.LENGTH_SHORT).show();
			changeViewAnimation(index, tv);
			break;
		}
	}
    
  //dip/px像素單位轉(zhuǎn)換
	public static int dip2px(Context context, float dipValue){   
        final float scale = context.getResources().getDisplayMetrics().density;   
        return (int)(dipValue / scale + 0.5f);   
    }   
	public static int px2dip(Context context, float pxValue){   
		final float scale = context.getResources().getDisplayMetrics().density;   
	    return (int)(pxValue * scale + 0.5f);   
	}  
}

  

text6.xml
    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
  	android:orientation="vertical"
  	android:layout_width="fill_parent"
  	android:layout_height="fill_parent">

	<com.ql.view.SegmentControl
 		android:id="@+id/segcontrol"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_gravity="bottom"
 		/>
  		<!-- android:gravity="right" -->
  		
  	<ViewFlipper android:id="@+id/flipper" 
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent" 
		android:gravity="center"
		/>
</LinearLayout>

  


妙用TabHost
http://www.cnblogs.com/over140/archive/2011/03/02/1968042.html

一個類似Tabs的控件SegmentControl


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一区二区三区在线视频观看 | 久久视频精品 | 五月桃花网婷婷亚洲综合 | 无码免费一区二区三区免费播放 | 国产一区二区精品久久凹凸 | 成人免费视频网站 | 中文欧美日韩 | 伊在人亚洲香蕉精品区麻豆 | 国产午夜精品福利视频 | 成人性视频网站 | 亚洲国产精品综合久久 | 男人在线资源 | 国产精品国产亚洲精品不卡 | 日本α级毛片视频免费观看 | 中国大陆一级毛片 免费 | 久久精品视频网 | 香蕉视频黄网站 | 日韩中文字幕精品一区在线 | 成人欧美视频在线看免费 | 全部无卡免费的毛片在线看 | 日韩在线色 | 亚洲最大视频网站 | 乱在线伦视频免费 | 毛片一级视频 | 久久久精品国产四虎影视 | 国产99re在线观看只有精品 | 亚洲国产成人久久精品影视 | 亚洲日韩欧美一区二区在线 | 国产日韩欧美综合 | 国产成人福利 | 日本一级在线观看 | 成人午夜爱爱爱爱爱 | 一本伊人 | 久久久久久人精品免费费看 | 日韩欧美亚洲每日更新网 | 嘿咻成人免费视频欧美激情 | 久久九九免费视频 | 免费国产成人高清在线观看视频 | 久久精品国产精品亚洲 | 欧美成人精品一区二区三区 | 免费aⅴ视频 |