搜档网
当前位置:搜档网 › android自定义滑动开关控件适合所有的android系统

android自定义滑动开关控件适合所有的android系统

android自定义滑动开关控件适合所有的android系统
android自定义滑动开关控件适合所有的android系统

android自定义滑动开关控件,适合所有的android系统

我们都知道Android4.0以上才带有滑动开关Switch,那么在4.0以下呢,很多人会选择用CheckBox,放两张图片,但是这样子只能点击,效果不太好,所以我就自定义了滑动开关WiperSwitch这么一个控件,下面先把截图贴上吧,这蹩脚的图片真戳啊,大家可以自己换三张图片[java] view plaincopypackage com.example.wiperswitch; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import

android.util.AttributeSet; import

android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; /** * * @author xiaanming * */ public class WiperSwitch extends View implements OnTouchListener{ private Bitmap bg_on, bg_off, slipper_btn; /** * 按下时的x和当前的x */ private float downX, nowX; /** * 记录用户是否在滑动*/ private boolean onSlip = false; /** * 当前的状

态*/ private boolean nowStatus = false;

/** * 监听接口*/ private OnChangedListener listener; public WiperSwitch(Context context) { super(context); init(); } public WiperSwitch(Context context, AttributeSet attrs) { super(context, attrs);

init(); } public void init(){ //载入图片资源bg_on =

BitmapFactory.decodeResource(getResources(),

R.drawable.on_btn); bg_off = BitmapFactory.decodeResource(getResources(),

R.drawable.off_btn); slipper_btn = BitmapFactory.decodeResource(getResources(),

R.drawable.white_btn);

setOnTouchListener(this); } protected void onDraw(Canvas canvas)

{ super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); float x = 0; //根据nowX设置背景,开或者关状态if (nowX <

(bg_on.getWidth()/2)){ canvas.drawBitmap( bg_off, matrix, paint);//画出关闭时的背

景}else{ canvas.drawBitmap(bg

_on, matrix, paint);//画出打开时的背景}

if (onSlip) {//是否是在滑动状态, if(nowX

>= bg_on.getWidth())//是否划出指定范围,不能让滑块跑到外头,必须做这个判断x =

bg_on.getWidth() - slipper_btn.getWidth()/2;//减去滑块1/2的长度else x = nowX - slipper_btn.getWidth()/2; }else

{ if(nowStatus){//根据当前的状态设置滑块

的x值x = bg_on.getWidth() -

slipper_btn.getWidth(); }else{

x = 0; } }

//对滑块滑动进行异常处理,不能让滑块出界if (x < 0 ){ x = 0; } else

if(x > bg_on.getWidth() -

slipper_btn.getWidth()){ x =

bg_on.getWidth() - slipper_btn.getWidth(); }

//画出滑块canvas.drawBitmap(slipper_btn, x , 0, paint); } @Override public boolean onTouch(View v, MotionEvent event)

{ switch(event.getAction()){ case MotionEvent.ACTION_DOWN:{ if (event.getX() > bg_off.getWidth() || event.getY() >

bg_off.getHeight()){ return

false; }else{ onSlip = true; downX = event.getX();

nowX = downX; }

break; } case

MotionEvent.ACTION_MOVE:{ nowX = event.getX(); break; }

case MotionEvent.ACTION_UP:{ onSlip = false; if(event.getX() >=

(bg_on.getWidth()/2)){ nowStatus = true; nowX = bg_on.getWidth() - slipper_btn.getWidth(); }else{

nowStatus = false; nowX =

0; }

if(listener !=

null){ listener.OnChanged(WiperSwitc h.this, nowStatus); }

break; } } //刷新界面invalidate(); return true; }

/** * 为WiperSwitch设置一个监听,供外部调用的方法* @param listener */ public void setOnChangedListener(OnChangedListener

listener){ this.listener = listener; }

/** * 设置滑动开关的初始状态,供外部调用* @param checked */ public void

setChecked(boolean

checked){ if(checked){ nowX = bg_off.getWidth(); }else{ nowX = 0; } nowStatus = checked; }

/** * 回调接口* @author len * */ public interface OnChangedListener { public void OnChanged(WiperSwitch wiperSwitch, boolean checkState); } }

用法是,先定义XML文件[html] view

plaincopy<RelativeLayout

xmlns:android="https://www.sodocs.net/doc/c812108874.html,/apk/res/andro id" xmlns:tools="https://www.sodocs.net/doc/c812108874.html,/tools" android:layout_width="match_parent"

android:layout_height="match_parent" >

<com.example.wiperswitch.WiperSwitch

android:id="@+id/wiperSwitch1"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

</RelativeLayout>

新建一个Activity[java] view plaincopypackage

com.example.wiperswitch; import

android.app.Activity; import android.os.Bundle; import android.util.Log; import

com.example.wiperswitch.WiperSwitch.OnChangedListen er; public class MainActivity extends Activity implements OnChangedListener { @Override public void onCreate(Bundle savedInstanceState)

{ super.onCreate(savedInstanceState); setContentView(https://www.sodocs.net/doc/c812108874.html,yout.activity_main); //实例化WiperSwitch WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.wiperSwitch1);

//设置初始状态为false

wiperSwitch.setChecked(false); //设置监听

wiperSwitch.setOnChangedListener(this); }

@Override public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) { Log.e("log", "" + checkState); } } 代码全部上完了,写的不好的地方欢迎大牛指点!哦,忘记了还有三张蹩脚的图片没传

android 自定义圆角头像以及使用declare-styleable进行配置属性解析

android 自定义圆角头像以及使用declare-styleable进行配置属性解析由于最新项目中正在检查UI是否与效果图匹配,结果关于联系人模块给的默认图片是四角稍带弧度的圆角,而我们截取的图片是正方形的,现在要给应用统一替换。应用中既用到大圆角头像(即整个头像是圆的)又用到四角稍带弧度的圆角头像,封装一下以便重用。以下直接见代码 [java] view plain copy 在CODE上查看代码片派生到我的代码片 package com.test.demo; import com.test.demo.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.widget.ImageView; /** * 圆角imageview */ public class RoundImageView extends ImageView { private static final String TAG = "RoundImageView"; /** * 图片的类型,圆形or圆角 */ private int type; public static final int TYPE_CIRCLE = 0; public static final int TYPE_ROUND = 1; /** * 圆角大小的默认值

android studio 控件常用属性

android studio 控件常用属性 下面是RelativeLayout各个属性 1.android:layout_above="@id/xxx" --将控件置于给定ID控件之上 2.android:layout_below="@id/xxx" --将控件置于给定ID控件之下 3. android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐 4.android:layout_toRightOf="@id/xxx" --将控件的左边缘和给定ID控件的右边缘对齐 5. android:layout_alignLeft="@id/xxx" --将控件的左边缘和给定ID控件的左边缘对齐 6.android:layout_alignTop="@id/xxx" --将控件的上边缘和给定ID控件的上边缘对齐 7.android:layout_alignRight="@id/xxx" --将控件的右边缘和给定ID控件的右边缘对齐 8.android:layout_alignBottom="@id/xxx" --将控件的底边缘和给定ID控件的底边缘对齐 9.android:layout_alignParentLeft="true" --将控件的左边缘和父控件的左边缘对齐 10. android:layout_alignParentTop="true" --将控件的上边缘和父控件的上边缘对齐 11. android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐 12.android:layout_alignParentBottom="true" --将控件的底边缘和父控件的底边缘对齐 13.android:layout_centerInParent="true" --将控件置于父控件的中心位置 14.android:layout_centerHorizontal="true" --将控件置于水平方向的中心位置 15.android:layout_centerVertical="true" --将控件置于垂直方向的中心位置 android:layout_width 设置组件的宽度 android:layout_height 设置组件的高度 android:id 给组件定义一个id值,供后期使用 android:background 设置组件的背景颜色或背景图片 android:text 设置组件的显示文字 android:textColor 设置组件的显示文字的颜色 android:layout_below 组件在参考组件的下面 android:alignTop 同指定组件的顶平行

Android平台我的日记设计文档

Android平台我的日记 设计文档 项目名称:mydiray 项目结构示意: 阶段任务名称(一)布局的设计 开始时间: 结束时间: 设计者: 梁凌旭 一、本次任务完成的功能 1、各控件的显示 二、最终功能及效果 三、涉及知识点介绍 四、代码设计 activity_main.xml:

android:layout_centerHorizontal="true" android:layout_marginTop="88dp" android:text="@string/wo" android:textSize="35sp"/>