defstyleattr订阅号可以自定义菜单吗

来自CSDN博客:C语言强化(十)求 1+2+…+n | 要求:不使用关键字
blog__7027913
Sum += N; }
来自CSDN博客:自定义progressDialog(数据加载框)的实现
blog__7857497
package cn.xxs.test.myfragmentprojecttest.customwidget;import cn.xxs.test.myfragmentprojecttest.R;import android.app.Dialog;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.LayoutInflater;import android.view.View;
import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;
public class MyDialog
* 自定义的progressDialog
* @param context 上下文
* @param msg 加载数据时显示的信息
* @return Dialog
*/ @SuppressWarnings(&deprecation&) public static Dialog createLoadingDialog(Context context, String msg) {
LayoutInflater inflater = LayoutInflater.from(context);
//加载loading_dialog.xml
View v = inflater.inflate(R.layout.loading_dialog, null);// 得到加载view
// loading_dialog.xml中的LinearLayout
LinearLayout layout = (LinearLayout) v.findViewById(R.id.dialog_view);// 加载布局
// loading_dialog.xml中的TextView
TextView tipTextView = (TextView) v.findViewById(R.id.tipTextView);// 提示文字
tipTextView.setText(msg);// 设置加载信息(如:登录中,请稍候...)
// loading_dialog.xml中的ImageView
ImageView spaceshipImage = (ImageView) v.findViewById(R.id.img);
// 加载动画load_animation.xml
Animation anim = AnimationUtils.loadAnimation(context, R.anim.load_animation);
// 使用ImageView显示动画
spaceshipImage.startAnimation(anim);
// 创建自定义样式loading_dialog
Dialog loadingDialog = new Dialog(context, R.style.loading_dialog);
loadingDialog.setCancelable(false);// 不可以用“返回键”取消
// 设置布局
loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT));
return loadingDialog; }}
来自CSDN博客:自定义菜单项的ListView
blog__6393125
&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent& &
&com.tata.main.ExpandableMenuListView
android:id=&@+id/listView1&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:layout_alignParentRight=&true&
android:layout_alignParentTop=&true& /&&/RelativeLayout&
来自CSDN博客:自定义ProgressDialog进度条对话框的实现
blog__2824718
&FrameLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&&&LinearLayout
android:layout_width=&798px&
android:layout_height=&460px&
android:orientation=&vertical& android:background=&@drawable/common_progress_dialog_background&& &TextView
android:id=&@+id/progress_message&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:textSize=&44px&
android:layout_marginTop=&113px&
android:layout_gravity=&center_horizontal&
android:textColor=&#ffffff&
&ProgressBar
android:id=&@+id/progress&
style=&?android:attr/progressBarStyleHorizontal&
android:layout_width=&712px&
android:layout_height=&30px&
android:layout_marginTop=&100px&
android:layout_marginLeft=&47px&
android:layout_centerHorizontal=&true&
android:progressDrawable=&@drawable/common_progressdialog_progressbar_background&
&LinearLayout
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:orientation=&horizontal&
android:id=&@+id/progress_percent&
android:layout_width=&80px&
android:layout_height=&wrap_content&
android:textSize=&30px&
android:layout_marginLeft=&280px&
android:gravity=&center_horizontal&
android:textColor=&#ffffff&
android:id=&@+id/progress_number&
android:layout_width=&250px&
android:layout_height=&wrap_content&
android:layout_marginLeft=&120px&
android:textSize=&30px&
android:gravity=&center_horizontal&
android:textColor=&#ffffff&
&/LinearLayout&&/LinearLayout&&/FrameLayout&
来自CSDN博客:freemarker自定义标签报错(三)
blog__1548052
freemarker.core.ParseException: Encountered & & at line 14, column 12 in myself.ftl.Was expecting one of:
&STRING_LITERAL& ...
&RAW_STRING& ...
&false& ...
&true& ...
&INTEGER& ...
&DECIMAL& ...
at freemarker.core.FMParser.generateParseException(FMParser.java:4702) at freemarker.core.FMParser.jj_consume_token(FMParser.java:4573) at freemarker.core.FMParser.UnaryExpression(FMParser.java:328) at freemarker.core.FMParser.MultiplicativeExpression(FMParser.java:440) at freemarker.core.FMParser.AdditiveExpression(FMParser.java:390) at freemarker.core.FMParser.RangeExpression(FMParser.java:561) at freemarker.core.FMParser.RelationalExpression(FMParser.java:516) at freemarker.core.FMParser.EqualityExpression(FMParser.java:481) at freemarker.core.FMParser.AndExpression(FMParser.java:590) at freemarker.core.FMParser.OrExpression(FMParser.java:613) at freemarker.core.FMParser.Expression(FMParser.java:226) at freemarker.core.FMParser.UnifiedMacroTransform(FMParser.java:1896) at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2404) at freemarker.core.FMParser.Content(FMParser.java:2623) at freemarker.core.FMParser.OptionalBlock(FMParser.java:2791) at freemarker.core.FMParser.Root(FMParser.java:2963) at freemarker.template.Template.&init&(Template.java:171) at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:447) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:360) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:235) at freemarker.template.Configuration.getTemplate(Configuration.java:578) at freemarker.template.Configuration.getTemplate(Configuration.java:543) at com.you.freemarker.FreemarkerTemplate.getTemplate(FreemarkerTemplate.java:52) at com.you.freemarker.FreemarkerTemplate.printFtl(FreemarkerTemplate.java:76) at com.you.test.freemarker.FreemarkerTest.studentPrint(FreemarkerTest.java:217) at com.you.test.freemarker.FreemarkerTest.testMyself(FreemarkerTest.java:204) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
来自CSDN博客:自定义控件--带动画的CheckBox
blog__1158104
/* * Created by Hanks * Copyright (c) 2015 . All rights reserved * * 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 rxandroid.zyh.com.rxandroid.custom;import android.animation.ValueAnimator;import android.annotation.TargetApi;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Build;import android.util.AttributeSet;import android.view.View;import android.view.animation.LinearInterpolator;/** * Created by Administrator on . */public class TouchCheckBox extends View {
private Paint mCirclePaint;
private Paint mCorrectPaint;
private int radius;
//圆的半径
private int width, height;
//控件宽高
private int cx, cy;
//圆心xy坐标
private float[] points = new float[6]; //对号的3个点的坐标
private float correctProgress;
private float downY;
private boolean isChecked;
private boolean toggle;
private boolean isAnim;
private int animDurtion = 150;
private OnCheckedChangeListener listener;
private int unCheckColor = Color.GRAY;
private int circleColor = Color.RED;
public TouchCheckBox(Context context) {
this(context, null);
public TouchCheckBox(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public TouchCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TouchCheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
* @param context
private void init(Context context) {
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(Color.RED);
mCirclePaint.setStyle(Paint.Style.FILL);
mCorrectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCorrectPaint.setColor(Color.WHITE);
mCorrectPaint.setStyle(Paint.Style.FILL);
mCorrectPaint.setStrokeWidth(dip2px(context, 2));
setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (isChecked) {
hideCorrect();
showCheck();
* 设置当前选中状态
* @param checked
public void setChecked(boolean checked){
if (isChecked && !checked) {
hideCorrect();
} else if(!isChecked && checked) {
showCheck();
* 返回当前选中状态
public boolean isChecked(){
return isChecked;
* 确定尺寸坐标
* @param w
* @param h
* @param oldw
* @param oldh
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
height = width = Math.min(w - getPaddingLeft() - getPaddingRight(),h - getPaddingBottom() - getPaddingTop());
cx = w / 2;
cy = h / 2;
float r = height / 2f;
points[0] = r / 2f + getPaddingLeft();
points[1] = r + getPaddingTop();
points[2] = r * 5f / 6f + getPaddingLeft();
points[3] = r + r / 3f + getPaddingTop();
points[4] = r * 1.5f +getPaddingLeft();
points[5] = r - r / 3f + getPaddingTop();
radius = (int) (height * 0.125f);
protected void onDraw(Canvas canvas) {
float f = (radius -height * 0.125f) / (height * 0.5f); //当前进度
mCirclePaint.setColor(evaluate(f,unCheckColor,circleColor));
canvas.drawCircle(cx, cy, radius, mCirclePaint); //画圆
if(correctProgress&0) {
if(correctProgress&1/3f) {
float x = points[0] + (points[2] - points[0]) * correctProgress;
float y = points[1] + (points[3] - points[1]) * correctProgress;
canvas.drawLine(points[0], points[1], x, y, mCorrectPaint);
float x = points[2] + (points[4] - points[2]) * correctProgress;
float y = points[3] + (points[5] - points[3]) * correctProgress;
canvas.drawLine(points[0], points[1], points[2], points[3], mCorrectPaint);
canvas.drawLine(points[2], points[3], x,y, mCorrectPaint);
* 设置圆的颜色
* @param color
public void setCircleColor(int color){
circleColor = color;
* 设置对号的颜色
* @param color
public void setCorrectColor(int color){
mCorrectPaint.setColor(color);
* 设置未选中时的颜色
* @param color
public void setUnCheckColor(int color){
unCheckColor = color;
private int evaluate(float fraction, int startValue, int endValue) {
int startInt = startValue;
int startA = (startInt && 24) & 0xff;
int startR = (startInt && 16) & 0xff;
int startG = (startInt && 8) & 0xff;
int startB = startInt & 0xff;
int endInt = endValue;
int endA = (endInt && 24) & 0xff;
int endR = (endInt && 16) & 0xff;
int endG = (endInt && 8) & 0xff;
int endB = endInt & 0xff;
return ((startA + (int) (fraction * (endA - startA))) && 24)
| ((startR + (int) (fraction * (endR - startR))) && 16)
| ((startG + (int) (fraction * (endG - startG))) && 8)
| ((startB + (int) (fraction * (endB - startB))));
* 处理触摸事件触发动画
/*private class OnChangeStatusListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
Log.i(&Touch&,&Touch&);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = event.getRawY();
case MotionEvent.ACTION_MOVE:
float dy = event.getRawY() - downY;
if (Math.abs(dy) &= 0) { //滑过一半触发
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (toggle) {
if (isChecked) {
hideCorrect();
showCheck();
private void showUnChecked() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
radius = (int) ((1 - value) * height * 0.375f + height * 0.125f);
if (value &= 1) {
isChecked = false;
isAnim = false;
if(listener!=null){
listener.onCheckedChanged(TouchCheckBox.this,false);
invalidate();
private void showCheck() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
radius = (int) (value * height * 0.37f + height * 0.125f);
if (value &= 1) {
isChecked = true;
isAnim = false;
if(listener!=null){
listener.onCheckedChanged(TouchCheckBox.this,true);
showCorrect();
invalidate();
private void showCorrect() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
correctProgress = value;
invalidate();
if(value&=1){
isAnim = false;
private void hideCorrect() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
correctProgress = 1-value;
invalidate();
if(value&=1){
isAnim = false;
showUnChecked();
public void setOnCheckedChangeListener(OnCheckedChangeListener listener){
this.listener = listener;
public interface OnCheckedChangeListener{
void onCheckedChanged(View buttonView, boolean isChecked);
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
来自CSDN博客:解决TextView排版不齐问题----自定义TextVIew
blog__6680865
import org.json.JSONArray;import org.json.JSONException;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import android.widget.TextView;public class MarginTextView extends TextView{ private final String namespace =&/apk/res/android&; private String text; private float textSize; private float paddingLeft; private float paddingRight; private float marginLeft; private float marginRight; private int textColor; private JSONArray colorIndex; private Paint paint1 = new Paint(); private Paint paintColor = new Paint(); private float textShowWidth; private float Spacing = 0; private float LineSpacing = 1.3f;//行与行的间距
public MarginTextView(Context context, AttributeSet attrs) {
super(context, attrs);
text = attrs.getAttributeValue(
namespace, &text&);
/**资源id---形式为@*/
color_resource_id=attrs.getAttributeValue(namespace, &textColor&);
/**去掉资源id前面的@*/
String resource_id2=color_resource_id.substring(1);
System.out.println(&color_name===&+resource_id2+&,resource_id=&+color_resource_id);
* 根据R文件中的颜色的资源id获取颜色对应的int数值
int color_int=getResources().getColor(Integer.parseInt(resource_id2));
System.out.println(&color_int==&+color_int);
String textSize_yuanshi=attrs.getAttributeValue(namespace, &textSize&);
String textSize_2=textSize_yuanshi.substring(0, textSize_yuanshi.indexOf(&.&));
System.out.println(&textSize_yuanshi=&+textSize_yuanshi+&,textSize_2==&+textSize_2);
textSize=Integer.parseInt(textSize_2);//字体大小
textColor=color_int;
System.out.println(&textColor================&+textColor);//-8388480
paddingLeft = attrs.getAttributeIntValue(namespace, &paddingLeft&, 0);
paddingRight = attrs.getAttributeIntValue(namespace, &paddingRight&, 0);
marginLeft = attrs.getAttributeIntValue(namespace, &marginLeft&, 0);
marginRight = attrs.getAttributeIntValue(namespace, &marginRight&, 0);
paint1.setTextSize(textSize);
paint1.setColor(textColor);
paint1.setAntiAlias(true);
paintColor.setAntiAlias(true);
paintColor.setTextSize(textSize);
paintColor.setColor(Color.WHITE); } public MarginTextView(Context context, float textSize, int textColor, float paddingLeft, float paddingRight, float marginLeft, float marginRight){
super(context);
this.textSize = textSize;
this.textColor = textColor;
this.paddingLeft = paddingLeft;
this.paddingRight = paddingRight;
this.marginLeft = marginLeft;
this.marginRight = marginRight;
paint1.setTextSize(textSize);
paint1.setColor(textColor);
paint1.setAntiAlias(true);
paintColor.setAntiAlias(true);
paintColor.setTextSize(textSize);
paintColor.setColor(Color.WHITE); }
public JSONArray getColorIndex() {
return colorIndex; } public void setColorIndex(JSONArray colorIndex) {
this.colorIndex = colorIndex; } /**
* 传入一个索引,判断当前字是否被高亮
* @param index
* @throws JSONException
*/ public boolean isColor(int index) throws JSONException{
if(colorIndex == null){
return false;
for(int i = 0 ; i & colorIndex.length() ; i ++){
JSONArray array = colorIndex.getJSONArray(i);
int start = array.getInt(0);
int end = array.getInt(1)-1;
if(index &= start && index &= end){
return true;
return false; }
@Override protected void onDraw(Canvas canvas) {//
super.onDraw(canvas);
View view=(View)this.getParent();
textShowWidth=view.getMeasuredWidth()-paddingLeft - paddingRight - marginLeft - marginRight;
int lineCount = 0;
text = this.getText().toString();//.replaceAll(&\n&, &\r\n&);
if(text==null)return;
char[] textCharArray = text.toCharArray();
// 已绘的宽度
float drawedWidth = 0;
float charWidth;
for (int i = 0; i & textCharArray.length; i++) {
charWidth = paint1.measureText(textCharArray, i, 1);
if(textCharArray[i]=='\n'){
lineCount++;
drawedWidth = 0;
if (textShowWidth - drawedWidth & charWidth) {
lineCount++;
drawedWidth = 0;
boolean color = false;
color = isColor(i);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
if(color){
canvas.drawText(textCharArray, i, 1, paddingLeft + drawedWidth,
(lineCount + 1) * textSize * LineSpacing, paintColor);
canvas.drawText(textCharArray, i, 1, paddingLeft + drawedWidth,
(lineCount + 1) * textSize * LineSpacing, paint1);
if(textCharArray[i] & 127 && textCharArray[i] != '、' && textCharArray[i] != ',' && textCharArray[i] != '。' && textCharArray[i] != ':' && textCharArray[i] != '!'){
drawedWidth += charWidth + Spacing;
drawedWidth += charWidth;
setHeight((int) ((lineCount + 1) * (int) textSize * LineSpacing + 10)); } public float getSpacing() {
return Spacing; } public void setSpacing(float spacing) {
Spacing = spacing; } public float getMYLineSpacing() {
return LineSpacing; } public void setMYLineSpacing(float lineSpacing) {
LineSpacing = lineSpacing; } public float getMYTextSize() {
return textSize; } public void setMYTextSize(float textSize) {
this.textSize = textSize;
paint1.setTextSize(textSize);
paintColor.setTextSize(textSize); }
来自CSDN博客:freemarker自定义标签(一)
blog__5473637
&meta http-equiv=&content-type& content=&text/ charset=UTF-8&&
&title&freemarker自定义标签&/title&
&#--freemarker自定义标签--&
&#macro write&
repeat(&张三丰&,3)
&/body&&/html&
来自CSDN博客:自定义控件--带动画的CheckBox
blog__8238612
/* * Created by Hanks * Copyright (c) 2015 . All rights reserved * * 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 rxandroid.zyh.com.rxandroid.custom;import android.animation.ValueAnimator;import android.annotation.TargetApi;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Build;import android.util.AttributeSet;import android.view.View;import android.view.animation.LinearInterpolator;/** * Created by Administrator on . */public class TouchCheckBox extends View {
private Paint mCirclePaint;
private Paint mCorrectPaint;
private int radius;
//圆的半径
private int width, height;
//控件宽高
private int cx, cy;
//圆心xy坐标
private float[] points = new float[6]; //对号的3个点的坐标
private float correctProgress;
private float downY;
private boolean isChecked;
private boolean toggle;
private boolean isAnim;
private int animDurtion = 150;
private OnCheckedChangeListener listener;
private int unCheckColor = Color.GRAY;
private int circleColor = Color.RED;
public TouchCheckBox(Context context) {
this(context, null);
public TouchCheckBox(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public TouchCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TouchCheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
* @param context
private void init(Context context) {
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(Color.RED);
mCirclePaint.setStyle(Paint.Style.FILL);
mCorrectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCorrectPaint.setColor(Color.WHITE);
mCorrectPaint.setStyle(Paint.Style.FILL);
mCorrectPaint.setStrokeWidth(dip2px(context, 2));
setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (isChecked) {
hideCorrect();
showCheck();
* 设置当前选中状态
* @param checked
public void setChecked(boolean checked){
if (isChecked && !checked) {
hideCorrect();
} else if(!isChecked && checked) {
showCheck();
* 返回当前选中状态
public boolean isChecked(){
return isChecked;
* 确定尺寸坐标
* @param w
* @param h
* @param oldw
* @param oldh
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
height = width = Math.min(w - getPaddingLeft() - getPaddingRight(),h - getPaddingBottom() - getPaddingTop());
cx = w / 2;
cy = h / 2;
float r = height / 2f;
points[0] = r / 2f + getPaddingLeft();
points[1] = r + getPaddingTop();
points[2] = r * 5f / 6f + getPaddingLeft();
points[3] = r + r / 3f + getPaddingTop();
points[4] = r * 1.5f +getPaddingLeft();
points[5] = r - r / 3f + getPaddingTop();
radius = (int) (height * 0.125f);
protected void onDraw(Canvas canvas) {
float f = (radius -height * 0.125f) / (height * 0.5f); //当前进度
mCirclePaint.setColor(evaluate(f,unCheckColor,circleColor));
canvas.drawCircle(cx, cy, radius, mCirclePaint); //画圆
if(correctProgress&0) {
if(correctProgress&1/3f) {
float x = points[0] + (points[2] - points[0]) * correctProgress;
float y = points[1] + (points[3] - points[1]) * correctProgress;
canvas.drawLine(points[0], points[1], x, y, mCorrectPaint);
float x = points[2] + (points[4] - points[2]) * correctProgress;
float y = points[3] + (points[5] - points[3]) * correctProgress;
canvas.drawLine(points[0], points[1], points[2], points[3], mCorrectPaint);
canvas.drawLine(points[2], points[3], x,y, mCorrectPaint);
* 设置圆的颜色
* @param color
public void setCircleColor(int color){
circleColor = color;
* 设置对号的颜色
* @param color
public void setCorrectColor(int color){
mCorrectPaint.setColor(color);
* 设置未选中时的颜色
* @param color
public void setUnCheckColor(int color){
unCheckColor = color;
private int evaluate(float fraction, int startValue, int endValue) {
int startInt = startValue;
int startA = (startInt && 24) & 0xff;
int startR = (startInt && 16) & 0xff;
int startG = (startInt && 8) & 0xff;
int startB = startInt & 0xff;
int endInt = endValue;
int endA = (endInt && 24) & 0xff;
int endR = (endInt && 16) & 0xff;
int endG = (endInt && 8) & 0xff;
int endB = endInt & 0xff;
return ((startA + (int) (fraction * (endA - startA))) && 24)
| ((startR + (int) (fraction * (endR - startR))) && 16)
| ((startG + (int) (fraction * (endG - startG))) && 8)
| ((startB + (int) (fraction * (endB - startB))));
* 处理触摸事件触发动画
/*private class OnChangeStatusListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
Log.i(&Touch&,&Touch&);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = event.getRawY();
case MotionEvent.ACTION_MOVE:
float dy = event.getRawY() - downY;
if (Math.abs(dy) &= 0) { //滑过一半触发
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (toggle) {
if (isChecked) {
hideCorrect();
showCheck();
private void showUnChecked() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
radius = (int) ((1 - value) * height * 0.375f + height * 0.125f);
if (value &= 1) {
isChecked = false;
isAnim = false;
if(listener!=null){
listener.onCheckedChanged(TouchCheckBox.this,false);
invalidate();
private void showCheck() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
radius = (int) (value * height * 0.37f + height * 0.125f);
if (value &= 1) {
isChecked = true;
isAnim = false;
if(listener!=null){
listener.onCheckedChanged(TouchCheckBox.this,true);
showCorrect();
invalidate();
private void showCorrect() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
correctProgress = value;
invalidate();
if(value&=1){
isAnim = false;
private void hideCorrect() {
if (isAnim) {
isAnim = true;
ValueAnimator va = ValueAnimator.ofFloat(0, 1).setDuration(animDurtion);
va.setInterpolator(new LinearInterpolator());
va.start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue(); // 0f ~ 1f
correctProgress = 1-value;
invalidate();
if(value&=1){
isAnim = false;
showUnChecked();
public void setOnCheckedChangeListener(OnCheckedChangeListener listener){
this.listener = listener;
public interface OnCheckedChangeListener{
void onCheckedChanged(View buttonView, boolean isChecked);
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
来自CSDN博客:smarty3注册模板插件
blog__6811428
Empty file}

我要回帖

更多关于 lol自定义有经验吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信