18

パスを使用して星形を表示するカスタム ビューがあります。このビューは期待どおりに機能しますが、実装を新しい Google Material の推奨事項に移行したいと考えています。

残念ながらelevation、凸状のアウトラインに依存しており、まだ解決策を見つけていません。

既知の回避策やその他の創造的な解決策はありますか?

ここに画像の説明を入力

これは私の凹型パスです:

    double outerSize = w / 2;
    double innerSize = w / 5;
    double delta = 2.0*Math.PI/5.0;
    double rotation = Math.toRadians(-90);
    double xpos = w/2.0;
    double ypos = h/2.0;
    mPath = new Path();

    mPath.moveTo((float)(outerSize * Math.cos(delta + rotation) + xpos),
                 (float)(outerSize * Math.sin(delta + rotation) + ypos));

    for(int point= 0;point<6;point++)
    {
        mPath.lineTo((float) (innerSize * Math.cos(delta * (point + 0.5) + rotation) + xpos),
                (float) (innerSize * Math.sin(delta * (point + 0.5) + rotation) + ypos));
        mPath.lineTo((float) (outerSize * Math.cos(delta * (point + 1.0) + rotation) + xpos),
                (float) (outerSize * Math.sin(delta * (point + 1.0) + rotation) + ypos));
    }

    mPath.close();

私は成功せずにこのコードを試しましたが、これは凸面ビューでうまく機能します。

@TargetApi(21)
private class StarOutline extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        StartView r = (StartView) view;
        // i know here say setConvexPath not setConcavePath
        outline.setConvexPath(r.mPath); 
    }
}

しかし、予想どおり、例外が発生しています。

java.lang.IllegalArgumentException: path must be convex
        at android.graphics.Outline.setConvexPath(Outline.java:216)

この目的を達成する方法はありますか?

4

2 に答える 2

0

AndroidX パッケージに MaterialShapeDrawable という新しいドローアブルがあります。パスを指定すると、凹面と凸面の両方の形状に影をレンダリングできます。

https://developer.android.com/reference/com/google/android/material/shape/MaterialShapeDrawable

これは、MaterialShapeDrawable を使用せずに凹形状に影を付ける方法です。

  • 新しいビットマップを作成する
  • ビットマップを変更します (新しいキャンバス オブジェクトを使用して星形のパスを描画します)。
  • 実際に影のように見えるように、ビットマップをぼかします。(パフォーマンス上の理由から、ぼかしは RenderScript で行う必要があります)
  • ビュー Canvas にビットマップを描画します。
于 2019-05-18T14:21:00.240 に答える