package com.diandian.ycdyus.moneymanager.view;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.ViewParent;
import android.widget.CheckBox;
import com.diandian.ycdyus.moneymanager.R;
import com.diandian.ycdyus.moneymanager.anim.FrameAnimationController;
/**
* @describe ʹ���˵������� SwitchButton�������������Ե�ע�ͣ���������
* @author https://github.com/Issacw0ng/SwitchButton
*
*/
public class CheckSwitchButton extends CheckBox {
/** ���� */
private Paint mPaint;
private ViewParent mParent;
private Bitmap mBottom;
private Bitmap mCurBtnPic;
private Bitmap mBtnPressed;
private Bitmap mBtnNormal;
/** ������ */
private Bitmap mFrame;
/** ��Ӱ�㣬���ܵ����ʱ����ʾ */
private Bitmap mMask;
/** ���沼�ֵľ��� */
private RectF mSaveLayerRectF;
/** ����֮����㣬�ñȱ����ͱ����ϵ�ͼƬЧ�� */
private PorterDuffXfermode mXfermode;
/** �״ΰ��µ�Y */
private float mFirstDownY;
/** �״ΰ��µ�X */
private float mFirstDownX;
/** ͼƬ�Ļ���λ�� */
private float mRealPos;
/** ��ť��λ�� */
private float mBtnPos;
/** ���ش�λ�� */
private float mBtnOnPos;
/** ���عرյ�λ�� */
private float mBtnOffPos;
/** ��Ӱ�Ŀ�� */
private float mMaskWidth;
/** ��Ӱ�ĸ߶� */
private float mMaskHeight;
/** ����Բ�ΰ�ť�Ŀ�� */
private float mBtnWidth;
/** ���س�ʼ���� */
private float mBtnInitPos;
private int mClickTimeout;
private int mTouchSlop;
/** ������ȣ����Dz��� */
private final int MAX_ALPHA = 255;
/** ��ǰ���ȣ�������Ҫ��������ؼ���enable����Ϊfalseʱ�����ð��� ���������Ե�� */
private int mAlpha = MAX_ALPHA;
private boolean mChecked = false;
private boolean mBroadcasting;
private boolean mTurningOn;
private PerformClick mPerformClick;
/** ����״̬�л������ӿ� */
private OnCheckedChangeListener mOnCheckedChangeListener;
private OnCheckedChangeListener mOnCheckedChangeWidgetListener;
/** �ж��Ƿ��ڽ��ж��� */
private boolean mAnimating;
private final float VELOCITY = 350;
/** �����ٶ� */
private float mVelocity;
private final float EXTENDED_OFFSET_Y = 15;
/** Y�᷽�����������,���������� */
private float mExtendOffsetY;
private float mAnimationPosition;
private float mAnimatedVelocity;
public CheckSwitchButton(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.checkboxStyle);
}
public CheckSwitchButton(Context context) {
this(context, null);
}
public CheckSwitchButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
private void initView(Context context) {
mPaint = new Paint();
mPaint.setColor(Color.WHITE);
Resources resources = context.getResources();
// get viewConfiguration
mClickTimeout = ViewConfiguration.getPressedStateDuration()
+ ViewConfiguration.getTapTimeout();
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
// get Bitmap
mBottom = BitmapFactory.decodeResource(resources, R.mipmap.p_switch_onoff);
mBtnPressed = BitmapFactory.decodeResource(resources,R.mipmap.p_switch_btn_pressed);
mBtnNormal = BitmapFactory.decodeResource(resources,R.mipmap.p_switch_btn_unpressed);
mFrame = BitmapFactory.decodeResource(resources, R.mipmap.p_switch_frame);
mMask = BitmapFactory.decodeResource(resources, R.mipmap.p_switch_mask);
mCurBtnPic = mBtnNormal;
mBtnWidth = mBtnPressed.getWidth();
mMaskWidth = mMask.getWidth();
mMaskHeight = mMask.getHeight();
mBtnOffPos = mBtnWidth / 2;
mBtnOnPos = mMaskWidth - mBtnWidth / 2;
// �ж���ʼλ��,����趨��mCheckedΪtrue����ʼλ��Ϊ mBtnOnPos
mBtnPos = mChecked ? mBtnOnPos : mBtnOffPos;
mRealPos = getRealPos(mBtnPos);
// density �ܶ�
final float density = getResources().getDisplayMetrics().density;// �����ǻ�ȡ��Դ�ܶȣ�Density��
mVelocity = (int) (VELOCITY * density + 0.5f);
mExtendOffsetY = (int) (EXTENDED_OFFSET_Y * density + 0.5f);
// ����һ���µľ�����ָ�������ꡣ
mSaveLayerRectF = new RectF(0, mExtendOffsetY, mMask.getWidth(),
mMask.getHeight() + mExtendOffsetY);
mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);// PorterDuff.Mode.SRC_IN
// ��������Դ���
// ȡ������ƽ�������ʾ�ϲ㡣
}
@Override
public void setEnabled(boolean enabled) {
mAlpha = enabled ? MAX_ALPHA : MAX_ALPHA / 2;
super.setEnabled(enabled);
}
public boolean isChecked() {
return mChecked;
}
/** �Զ��ж��л����෴������ : true -->false ;false -->true */
public void toggle() {
setChecked(!mChecked);
}
/**
* �ڲ����ô˷�������checked״̬���˷������ӳ�ִ�и��ֻص���������֤������������
*
* @param checked
*/
private void setCheckedDelayed(final boolean checked) {
this.postDelayed(new Runnable() {
@Override
public void run() {
setChecked(checked);
}
}, 10);
}
/**
* <p>
* Changes the checked state of this button.
* </p>
*
* @param checked
* true to check the button, false to uncheck it
*/
public void setChecked(boolean checked) {
if (mChecked != checked) {
mChecked = checked;
mBtnPos = checked ? mBtnOnPos : mBtnOffPos;
mRealPos = getRealPos(mBtnPos);
invalidate();
// Avoid infinite recursions if setChecked() is called from a
// listener
if (mBroadcasting) {
return;
}
mBroadcasting = true;
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(CheckSwitchButton.this,mChecked);
}
if (mOnCheckedChangeWidgetListener != null) {
mOnCheckedChangeWidgetListener.onCheckedChanged(CheckSwitchButton.this, mChecked);
}
mBroadcasting = false;
}
}
/**
* Register a callback to be invoked when the checked state of this button
* changes.
*
* @param listener
* the callback to call on checked state change
*/
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}
/**
* Register a callback to be invoked when the checked state of this button
* changes. This callback is used for internal purpose only.
*
* @param listener
* the callback to call on checked state change
* @hide
*/
void setOnCheckedChangeWidgetListener(OnCheckedChangeListener listener) {
mOnCheckedChangeWidgetListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
float x = event.getX();
float y = event.getY();
float deltaX = Math.abs(x - mFirstDownX);
float deltaY = Math.abs(y - mFirstDownY);
switch (action) {
case MotionEvent.ACTION_DOWN:
attemptClaimDrag();
mFirstDownX = x;
mFirstDownY = y;
mCurBtnPic = mBtnPressed;
mBtnInitPos = mChecked ? mBtnOnPos : mBtnOffPos;
break;
case MotionEvent.ACTION_MOVE:
// �϶��ŵ�ʱ��
float time = event.getEventTime(
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计-基于JAVA的记账软件 (250个子文件)
gradlew.bat 2KB
.gitignore 91B
.gitignore 7B
build.gradle 966B
build.gradle 525B
settings.gradle 15B
gradlew 5KB
app.iml 8KB
MoneyManager.iml 966B
gradle-wrapper.jar 49KB
CheckSwitchButton.java 11KB
MyImageView.java 4KB
MainActivity.java 3KB
AppManager.java 3KB
ViewHolders.java 3KB
NewRecordActivity.java 2KB
SpalshActivity.java 2KB
Utils.java 1KB
CommonAdapter.java 1KB
BudgetActivity.java 1KB
FrameAnimationController.java 1KB
NewRecordViewPagerAdapter.java 947B
NewRecordGridViewAdapter.java 882B
BaseActivity.java 631B
NewRecordGridViewModel.java 596B
MainListViewAdapter.java 538B
MainListViewModel.java 465B
BudgetManagerActivity.java 442B
AppConfig.java 406B
ApplicationTest.java 363B
GuideActivity.java 341B
.name 12B
startup.png 209KB
entertarget.png 34KB
d103.png 33KB
d105.png 33KB
d101.png 33KB
d104.png 32KB
d102.png 32KB
entertarget_press.png 32KB
enterbudget.png 32KB
enterbudget_press.png 30KB
d106.png 22KB
face_12.png 20KB
d36.png 20KB
d20.png 20KB
d23.png 20KB
d06.png 20KB
d03.png 20KB
d38.png 20KB
d26.png 20KB
d08.png 20KB
d39.png 20KB
d13.png 20KB
d18.png 20KB
d10.png 20KB
d30.png 20KB
d09.png 20KB
d16.png 20KB
d19.png 20KB
d29.png 20KB
d25.png 20KB
d28.png 20KB
d02.png 20KB
d32.png 20KB
d12.png 20KB
d35.png 20KB
d05.png 20KB
d24.png 20KB
d15.png 20KB
d37.png 19KB
d21.png 19KB
d27.png 19KB
d04.png 19KB
d34.png 19KB
d07.png 19KB
d22.png 19KB
d14.png 19KB
d31.png 19KB
d40.png 19KB
d43.png 19KB
d17.png 19KB
d33.png 19KB
d11.png 19KB
d46.png 19KB
d53.png 19KB
d56.png 19KB
d42.png 19KB
d50.png 19KB
d48.png 19KB
d49.png 19KB
d52.png 19KB
d45.png 19KB
d58.png 19KB
d59.png 19KB
d60.png 19KB
d41.png 19KB
d54.png 19KB
d63.png 19KB
d62.png 19KB
共 250 条
- 1
- 2
- 3
资源评论
十小大
- 粉丝: 1w+
- 资源: 2556
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功