~ Reprint Please indicate source: http://blog.csdn.net/u013015161/article/details/46704745
Introduced
Last night wrote an android slide switch, ie Slideswitch. The effect is as follows:
Realize
The implementation of the idea is very simple, monitoring the touch event on the control, and constantly refreshed, so that the slider in the position of the finger to draw, the slider to follow the finger slide display effect.
Check the code First:
Slideswitch.java
PackageCom.example.slideswitchexample;ImportAndroid.content.Context;ImportAndroid.graphics.Canvas;ImportAndroid.graphics.Color;ImportAndroid.graphics.Paint;ImportAndroid.util.AttributeSet;ImportAndroid.view.MotionEvent;ImportAndroid.view.View; Public class slideswitch extends View{ PrivatePaint Mpaint =NewPaint (Paint.anti_alias_flag);//anti-aliasing BooleanIsOn =false;floatCurX =0;floatCenterY;//y Fixed floatViewwidth;floatRadiusfloatLinestart;//The position at which the line segment begins (horizontal axis, i.e. floatLineend;//position where the line segment ends (ordinate floatLineWidth;Final intScale =4;//Control length is a multiple of the radius of the sliding circleOnstatechangedlistener Onstatechangedlistener; Public Slideswitch(context context, AttributeSet attrs,intDefstyle) {Super(Context, attrs, Defstyle); } Public Slideswitch(context context, AttributeSet attrs) {Super(context, attrs); } Public Slideswitch(Context context) {Super(context); }@Override Public Boolean ontouchevent(Motionevent event) {//TODO auto-generated method stubCurX = Event.getx ();if(event.getaction () = = motionevent.action_up) {if(CurX > Viewwidth/2) {CurX = Lineend;if(false= = IsOn) {The callback function is called only if the state has changed.Onstatechangedlistener.onstatechanged (true); IsOn =true; } }Else{CurX = Linestart;if(true= = IsOn) {onstatechangedlistener.onstatechanged (false); IsOn =false; } } }/ * Call ondraw*/via refresh This. Postinvalidate ();return true; }@Override protected void onmeasure(intWidthmeasurespec,intHEIGHTMEASURESPEC) {//TODO auto-generated method stub Super. Onmeasure (Widthmeasurespec, Heightmeasurespec);/ * Keep wide is high scale/2 times, that is, the diameter of the circle * / This. Setmeasureddimension ( This. Getmeasuredwidth (), This. Getmeasuredwidth () *2/scale); Viewwidth = This. Getmeasuredwidth (); radius = Viewwidth/scale; LineWidth = Radius *2F//Line width equals slider diameterCurX = radius; CenterY = This. Getmeasuredwidth ()/scale;//centery is half the heightLinestart = radius; Lineend = (Scale-1) * RADIUS; }@Override protected void OnDraw(Canvas canvas) {//TODO auto-generated method stub Super. OnDraw (canvas);/ * Limit sliding range * /CurX = CurX > Lineend?lineend:curx; CurX = CurX < Linestart?linestart:curx;/ * Dash * /Mpaint.setstyle (Paint.Style.STROKE); Mpaint.setstrokewidth (linewidth);/ * Line in left part, Blue * /Mpaint.setcolor (Color.Blue); Canvas.drawline (Linestart, CenterY, CurX, CenterY, Mpaint);/ * Line in the right part, Grey * /Mpaint.setcolor (Color.gray); Canvas.drawline (CurX, CenterY, Lineend, CenterY, Mpaint);/ * Draw Circle * / /* Draw the leftmost and most right circle, the diameter of the straight segment width, that is, in the straight segment with a semicircle on each side .Mpaint.setstyle (Paint.Style.FILL); Mpaint.setcolor (Color.gray); Canvas.drawcircle (Lineend, centery, LineWidth/2, Mpaint); Mpaint.setcolor (Color.Blue); Canvas.drawcircle (Linestart, centery, LineWidth/2, Mpaint);/ * Circular slider * /Mpaint.setcolor (Color.ltgray); Canvas.drawcircle (CurX, CenterY, radius, mpaint); }/ * Set switch status change listener * / Public void Setonstatechangedlistener(Onstatechangedlistener o) { This. Onstatechangedlistener = O; }/ * Internal interface, switch status change listener * / Public interface onstatechangedlistener { Public void onstatechanged(BooleanState); }}
The comments should be very detailed. The main points are as follows.
1. Override the Onmeasure method to make the control highly dependent on the width of the control . This ensures that the control's aspect ratio is always guaranteed, regardless of how it is set in the layout file.
2, control the movement of the slider block range
3, defines the internal interface Onstatechangedlistener, and in the custom control defines its object and the method Setonstatechangedlistener from the external assignment, in order to listen to the switch state change event and invoke the callback .
Use and Demo
Add the control in the layout file to use. The demo effect is animated (the color in the demo is green and the animation is blue because the green will cause problems when capturing gif, temporarily changing).
The layout file in the demo is as follows:
Activity_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" > <com.example.slideswitchexample.SlideSwitch android:id="@+id/slide_switch" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_centerInParent="true"/></RelativeLayout>
The activity code in the demo is as follows:
Mainactivity.java
PackageCom.example.slideswitchexample;ImportCom.example.slideswitchexample.SlideSwitch.OnStateChangedListener;Importandroid.app.Activity;ImportAndroid.os.Bundle;ImportAndroid.widget.Toast; Public class mainactivity extends Activity {Slideswitch Sswitch;@Override protected void onCreate(Bundle savedinstancestate) {Super. OnCreate (Savedinstancestate); Setcontentview (R.layout.activity_main); Sswitch = (slideswitch) This. Findviewbyid (R.id.slide_switch); Sswitch.setonstatechangedlistener (NewOnstatechangedlistener () {@Override Public void onstatechanged(BooleanState) {//TODO auto-generated method stub if(true= = State) {Toast.maketext (mainactivity. This,"switch is turned on", +). Show (); }Else{Toast.maketext (mainactivity). This,"switch is off", +). Show (); } } }); }}
Click here to download Demo Project
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
"Android" Custom controls implement sliding switches (switch)