完全カスタムコントロール-カスタムレーダースキャンコントロール(Shader、Matrixの学習)
3992 ワード
カスタムレーダスキャンコントロール
効果の表示
効果図
知識点に触れる
Shaderクラス
Androidでは、画像やジオメトリをレンダリングするためのShaderクラスが用意されています. Shaderクラスを使用して画像レンダリングを行う場合は、まずShaderオブジェクトを構築し、次にペイントのsetShader()メソッドでレンダリングオブジェクトを設定し、最後にこのペイントオブジェクトを画面に描画すればよい. Shaderクラスは、5つの直接サブクラス を含む BitmapShaderイメージレンダリング ComposeShaderブレンドレンダリング LinearGradientリニアレンダリング RadialGradientリングレンダリング SweepGradient勾配レンダリングSweepGradientは、スキャンレンダリングとも呼ばれ、ある中心でx軸の正方向を反時計回りに1周回転することによって形成されるスキャン効果のレンダリング形式を指す.
画像レンダリングの詳細
Matrixクラス
Matrixはマトリックスであり,主な機能は座標マッピング,数値変換である. Matrixクラスには4種類の基本変換があります 平行シフトsetTranslate()平行移動は、x軸およびy軸上で画像を簡単に移動することを意味する. スケールsetScale()パラメータとして2つの浮動小数点数を使用し、各軸で発生したスケール量を表します. 回転setRotate()回転の角度を表す浮動小数点数を使用します.既定のポイント(0,0)の周囲では、正の数は時計回りに画像を回転させ、負の数は逆の時計回りに画像を回転させます.既定のポイントは画像の左上隅です. 誤切setSkew()正接変換の場合、数学的にはShear mappingまたはTransvectionとも呼ばれ、比較的特殊な線形変換である.
Matrixの原理
実現構想.新規RadarView 4クラス継承View onDraw()メソッドを書き換え、4つの鋸歯のない中空の円環を描き、2本の直線 を描きます.最大円を半径とする実心グラデーション を描く.行列を作成し、キャンバスを回転し、再描画し、Handlerでループ を実現する.
1.初期化データ
2.描画開始
3.Handlerループ描画による回転
ここはプロジェクトの住所です.
リファレンスhttp://blog.csdn.net/itjianghuxiaoxiong/article/details/50207009 http://www.jianshu.com/p/4918034e3f0e# http://blog.csdn.net/sahadev_/article/details/50432764
効果の表示
効果図
知識点に触れる
Shaderクラス
Androidでは、画像やジオメトリをレンダリングするためのShaderクラスが用意されています.
// (cx,cy) , 360 。color0 ,color1 。
public SweepGradient(float cx, float cy, int[] colors, float[] positions)
public SweepGradient(float cx, float cy, int color0, int color1)
画像レンダリングの詳細
Matrixクラス
Matrixはマトリックスであり,主な機能は座標マッピング,数値変換である.
Matrixの原理
実現構想.
1.初期化データ
public RadarView4(Context context) {
this(context, null);
}
public RadarView4(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RadarView4(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// onDraw ,
init();
//
mHandler.post(run);
}
private void init() {
//
mCirclePaint = new Paint();
mCirclePaint.setColor(Color.GRAY);
//
mCirclePaint.setStrokeWidth(3);
//
mCirclePaint.setAntiAlias(true);
//
mCirclePaint.setStyle(Paint.Style.STROKE);
//
mShaderPaint = new Paint();
mShaderPaint.setAntiAlias(true);
//
mShaderPaint.setStyle(Paint.Style.FILL);
}
2.描画開始
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
w = getMeasuredWidth();// view
h = getMeasuredHeight();// view
//
canvas.drawCircle(w / 2, h / 2, w / 12, mCirclePaint);
canvas.drawCircle(w / 2, h / 2, w / 6, mCirclePaint);
canvas.drawCircle(w / 2, h / 2, w / 4, mCirclePaint);
canvas.drawCircle(w / 2, h / 2, w / 3, mCirclePaint);
//
canvas.drawLine(w / 2 - w / 3, h / 2, w / 2 + w / 3, h / 2, mCirclePaint);
canvas.drawLine(w / 2, h / 2 - w / 3, w / 2, h / 2 + w / 3, mCirclePaint);
//
if (mShader == null)
// , ->
mShader = new SweepGradient(w / 2, h / 2, Color.TRANSPARENT, getResources().getColor(R.color.RED));
//
mShaderPaint.setShader(mShader);
//
canvas.concat(mMatrix);
//
canvas.drawCircle(w / 2, h / 2, w / 3, mShaderPaint);
}
3.Handlerループ描画による回転
private Handler mHandler = new Handler();
Runnable run = new Runnable() {
@Override
public void run() {
start++;
mMatrix = new Matrix();
//
mMatrix.setRotate(start, w / 2, h / 2);
// ui
postInvalidate();
// 360 ,
start = start == 360 ? 0 : start;
//
postDelayed(this, 10);
}
};
ここはプロジェクトの住所です.
リファレンスhttp://blog.csdn.net/itjianghuxiaoxiong/article/details/50207009 http://www.jianshu.com/p/4918034e3f0e# http://blog.csdn.net/sahadev_/article/details/50432764