2016-10-21 11 views
1

HIを作成する形状と先端と、このレイアウトを作成しようとしています。この

title here title here](https://res.cloudinary.com/hashnode/image/upload/v1477050769/ismtsuj44lbvsksjztjh.png)[![enter image description here] 1 場所をdrawaableを指しSRCそれでビューを使用するように期待していますどのように描画可能なアンドロイドというの岩下recyclerviewで画像ビュー

<RelativeLayout 
     .... 
      > 
    <View 
     align_parentTop= true 
     src= " drawable with an invert tip inside " 
     .... 
      /> 
    <ImageView //actual image here 
     ... /> 

が、それはあなたが作成することができ、すべてのサイズ

+0

あなたはJavaでプリミティブを使用して図形を描画する必要があります。そうすれば、どこでも100%サポートされます。あなたは本当にXMLを全く必要としません。 – durbnpoisn

+0

9patch PNGファイルを使用する – theBugger

+0

@durbnpoisnどのようにすればいいのですか?すべてのリソースをお勧めします – user46772

答えて

0

をサポートしていますので、私は、私は形状を作成することができますし、またそれをXMLに変換するために、回転された画像をandroid:scaleY="-1"属性とし、の先端をdrawPathで描画します。 必要に応じて、画像とトライアングルの角度をscaleTypeに変更してください。

layout.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/imgInvertTip" 
     android:layout_width="match_parent" 
     android:layout_height="90dp" 
     android:scaleType="centerCrop" 
     android:scaleY="-1"/> 

    <ImageView 
     android:id="@+id/imgPhoto" 
     android:layout_width="match_parent" 
     android:layout_height="400dp" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/imgInvertTip" 
     android:scaleType="fitXY"/> 
</RelativeLayout> 

MainActivity.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final ImageView imgInvertedTip = (ImageView) findViewById(R.id.imgInvertTip); 
     ImageView imgPhoto = (ImageView) findViewById(R.id.imgPhoto); 

     Drawable photo = AppCompatResources.getDrawable(getApplicationContext(), R.drawable.photo); 
     imgInvertedTip.setBackground(photo); 
     imgPhoto.setImageDrawable(photo); 

     ViewTreeObserver vto = imgInvertedTip.getViewTreeObserver(); 
     vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      public boolean onPreDraw() { 
       imgInvertedTip.getViewTreeObserver().removeOnPreDrawListener(this); 

       int width = imgInvertedTip.getMeasuredWidth(); 
       int height = imgInvertedTip.getMeasuredHeight(); 
       Bitmap tip = createTip(width, height); 

       imgInvertedTip.setImageBitmap(tip); 
       return true; 
      } 
     }); 
    } 

    private Bitmap createTip(int width, int height) { 
     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(android.graphics.Color.WHITE); 
     paint.setStyle(Paint.Style.FILL_AND_STROKE); 
     paint.setAntiAlias(true); 

     int tipStep = height/2; 

     Point a = new Point(tipStep, 0); 
     Point b = new Point(tipStep * 2, 90); 
     Point c = new Point(tipStep * 3, 0); 

     Path path = new Path(); 
     path.setFillType(Path.FillType.INVERSE_EVEN_ODD); 
     path.lineTo(a.x, a.y); 
     path.lineTo(b.x, b.y); 
     path.lineTo(c.x, c.y); 
     path.close(); 

     Bitmap tip = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(tip); 
     canvas.drawPath(path, paint); 

     return tip; 
    } 
+0

これはリサイクラーで起こるはずです。この計算はそれほど良いことではありません。私は最も簡単な方法は実際の画像の前に別の画像を使用することを認識しています。問題はベクトルを使うことができるのでスケーリングは異なる画面サイズ – user46772

+0

は実際の写真を渡さずに上記のコードを拡張する方法です(実際にはリソースではない) 'imgInvertedTip.setBackground(photo);' glideを使ってurlから画像をレンダリングしています。レスプソン – user46772

+0

どうぞ、あなたの質問を更新してください(ベクトルについて)、それは完璧です –

関連する問題