編輯:關於Android編程
自己也是參考別人的一些自定義view例子,學習了一些基本的自定義view的方法。今天,我參考了一些資料,再結合自已的一些理解,做了一個一鍵清除的動畫。當年,我實現這個是用了幾張圖片,采用Frame anination的方式來實現,但是這個方法,不靈活,並且占資源,下面,我就采用自定義view的方法來實現這個功能。

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.example.administrator.customview.R;
public class OnKeyClearCircleView extends View implements Runnable{
private static final String TAG = OnKeyClearCircleView;
private Paint paint;
private Paint outCirclePaint;
private Paint textPaint;
private Paint outArcPaint;
private Paint radarPain;
private Paint pointPain;
private int radarRotateDegree;
private int innerCircleColor;
private int innerCircleRadius;
private int outCircleColor;
private float outArcwidth;
private SweepGradient outArcSweepGradient;
private SweepGradient radarSweepGradient;
private Bitmap pointDrawable;
private Matrix pointRotate=new Matrix();
private int progress;
private float textSize;
private int padding;
private float startAngle;
private float radarSweepAngle;
private float pointRotateDegree;
private boolean isSart;
public OnKeyClearCircleView(Context context) {
super(context);
init(null, 0);
}
public OnKeyClearCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public OnKeyClearCircleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.OnKeyClearCircleView, defStyle, 0);
innerCircleColor = a.getColor(R.styleable.OnKeyClearCircleView_innerCircleColor, Color.BLUE);
outCircleColor = a.getColor(R.styleable.OnKeyClearCircleView_outCircleColor, Color.GRAY);
innerCircleRadius = a.getInt(R.styleable.OnKeyClearCircleView_innerCircleRadius, 10);
progress = a.getInt(R.styleable.OnKeyClearCircleView_progress,0);
textSize = a.getDimension(R.styleable.OnKeyClearCircleView_textSize, 20);
outArcwidth = a.getDimension(R.styleable.OnKeyClearCircleView_outArcwidth, 20);
a.recycle();
pointDrawable = BitmapFactory.decodeResource(getResources(),R.drawable.point);
isSart = false;
startAngle = 0;
radarRotateDegree = 0;
radarSweepAngle = 0;
pointRotateDegree = 0;
padding = 5;
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(innerCircleColor);
outCirclePaint = new Paint();
outCirclePaint.setAntiAlias(true);
outCirclePaint.setColor(outCircleColor);
outCirclePaint.setStyle(Paint.Style.FILL);
textPaint = new Paint();
textPaint.setTextSize(textSize);
textPaint.setAntiAlias(true);
outArcPaint = new Paint();
outArcPaint.setAntiAlias(true);
outArcPaint.setStyle(Paint.Style.STROKE);
outArcPaint.setStrokeWidth(outArcwidth);
outArcPaint.setStrokeCap(Paint.Cap.ROUND);
radarPain = new Paint();
outArcPaint.setAntiAlias(true);
pointPain = new Paint();
pointPain.setAntiAlias(true);
Thread thread=new Thread(this);
thread.start();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int d = (width >= height) ? height : width;
setMeasuredDimension(d,d);
}
@Override
protected void onDraw(Canvas canvas) {
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int pointX = width/2;
int pointY = height/2;
RectF rectf = new RectF(outArcwidth/2,outArcwidth/2,width-outArcwidth/2,height-outArcwidth/2);
//outArcSweepGradient = new SweepGradient(0,0,getResources().getColor(R.color.start_color),getResources().getColor(R.color.end_color));
outArcSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.WHITE);
outArcPaint.setShader(outArcSweepGradient);
canvas.drawArc(rectf,startAngle,180,false,outArcPaint);
canvas.drawCircle(pointX,pointY,pointX -outArcwidth-padding,outCirclePaint);
if(radarSweepAngle < 180){
radarSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.RED);
}else{
radarSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.GREEN);
}
radarPain.setShader(radarSweepGradient);
RectF rectfRadar = new RectF(outArcwidth+padding,outArcwidth+padding,width-outArcwidth-padding,height-outArcwidth-padding);
canvas.drawArc(rectfRadar,0,radarSweepAngle,true,radarPain);
canvas.save();
canvas.translate(pointX,pointY);
pointRotate.setRotate(pointRotateDegree);
canvas.drawBitmap(pointDrawable, pointRotate, pointPain);
canvas.restore();;
canvas.drawCircle(pointX,pointY,innerCircleRadius,paint);
float textWidth = textPaint.measureText(progress + %);
if(progress < 50){
//textPaint.setColor(oxbf3800);
textPaint.setColor(Color.RED);
}else{
//textPaint.setColor(new Color(ox6ec705));
textPaint.setColor(Color.GREEN);
}
canvas.drawText(progress+%,pointX - textWidth/2,pointY + textSize/2 ,textPaint);
}
@Override
public void run() {
while(true){
if(isSart){
this.startAngle += 20;
if(this.startAngle > 360){
this.startAngle = this.startAngle-360;
}
this.radarSweepAngle += 10;
if(this.radarSweepAngle > 360){
this.radarSweepAngle = this.radarSweepAngle-360;
}
this.pointRotateDegree += 10;
if(this.pointRotateDegree > 360){
this.pointRotateDegree = this.pointRotateDegree-360;
}
progress = (int)radarSweepAngle*100/360;
postInvalidate();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void startClear(){
this.isSart = true;
}
public void stopClear(){
this.isSart =false;
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.administrator.customview.R;
public class CustomViewActivity4 extends Activity implements View.OnClickListener {
private OnKeyClearCircleView onKeyClearCircleView;
private Button start;
private Button end;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_view_activity4);
init();
}
private void init() {
onKeyClearCircleView = (OnKeyClearCircleView) findViewById(R.id.onKeyClearCircleView);
start = (Button) findViewById(R.id.start);
start.setOnClickListener(this);
end = (Button) findViewById(R.id.end);
end.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view == start){
onKeyClearCircleView.startClear();
}else if(view == end){
onKeyClearCircleView.stopClear();
}
}
}
Android RecyclerView上拉加載更多功能回彈實現代碼
實現原理是使用RecyclerView的OnTouchListener方法監聽滑動 在adapter裡面增加兩項footview 其中date.size為顯示的加載條,可
Android Fragment應用實戰(音樂播放器界面)
當下很多手機應用都會有一個非常類似的功能,即屏幕的下方顯示一行Tab標簽選項,點擊不同的標簽就可以切換到不同的界面,如以下幾個應用所示:以上底部這四個標簽,每一個分別對應
Android學習教程之分類側滑菜單(5)
本文實例為大家分享了Android分類側滑菜單的制作方法,供大家參考,具體內容如下classificmenuActivity.java代碼:package com.sis
Android訂票系統訂票功能實現(特效點擊按鈕實現票數自動加減1)
要實現的效果是點擊加按鈕就購買分數自動加一,同時計算合計的總計 先共享一份colors.xml的數據,比較全面,可以根據需要添加