android - studio - كيفية إعطاء شكل سداسي ل ImageView




textview android (6)

انظر هذا المثال الذي هو خلق مثلث حتى تتمكن من الحصول على المنطق منه :)

http://looksok.wordpress.com/2013/08/24/android-triangle-arrow-defined-as-an-xml-shape/

حل آخر وجدته ولكن لم يتم اختباره لذلك جرب هذا أيضا

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView tv = (TextView) findViewById(R.id.text);

    Path path = new Path();
    float stdW = 100;
    float stdH = 100;
    float w3 = stdW / 3;
    float h2 = stdH / 2;
    path.moveTo(0, h2);
    h2 -= 6 / 2;
    path.rLineTo(w3, -h2);         path.rLineTo(w3, 0); path.rLineTo(w3, h2);
    path.rLineTo(-w3, h2); path.rLineTo(-w3, 0); path.rLineTo(-w3, -h2);
    Shape s = new PathShape(path, stdW, stdH);
    ShapeDrawable d = new ShapeDrawable(s);
    Paint p = d.getPaint();
    p.setColor(0xffeeeeee);
    p.setStyle(Style.STROKE);
    p.setStrokeWidth(6);

    tv.setBackgroundDrawable(d);
} 

المصدر: مجموعة Google

الحل الثالث - قد تكون هذه المكتبة مفيدة

PathDrawable هو Drawable رسم أشكال بسيطة باستخدام كائن Path.

كيفية إعطاء شكل سداسي ل ImageView . هل من الممكن أن تفعل بنفس الطريقة؟ إذا كان الأمر كذلك فكيف. إذا لم يكن هذا ممكنا من خلال هذا كيف يمكن تحقيق ذلك؟

<shape xmlns:android="http//schemas.android.com/apk/res/android"
       android:shape="hexagon">
  <solid android:color="#ffffffff" />
  <size android:width="60dp"
        android:height="40dp" />
</shape>

لقطة شاشة

هنا لا أستطيع أن أفعل إخفاء الصورة لأنني لا أستطيع الكشف عن أي جزء من الصورة النقطية يجب أن أحصد للحصول على صورة نقطية شكل سداسي. لذلك أنا أبحث عن الإجابة لإعطاء شكل سداسي ل ImageView


تقرأ الوظيفة أدناه صورتك كصورة مدخلات ، وترجع الصورة النقطية التي هي شكل السداسي

public Bitmap getHexagonShape(Bitmap scaleBitmapImage) {
      // TODO Auto-generated method stub
      int targetWidth = 600;
      int targetHeight = 600;
      Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
                                targetHeight,Bitmap.Config.ARGB_8888);

                    Canvas canvas = new Canvas(targetBitmap);

      Path path = new Path();
        float stdW = 300;
        float stdH = 300;
        float w3 =stdW / 2;
        float h2 = stdH / 2;
        path.moveTo(0, (float) (h2*Math.sqrt(3)/2));
        path.rLineTo(w3/2, -(float) (h2*Math.sqrt(3)/2)); path.rLineTo(w3, 0);   path.rLineTo(w3/2, (float) (h2*Math.sqrt(3)/2));
        path.rLineTo(-w3/2, (float) (h2*Math.sqrt(3)/2)); path.rLineTo(-w3, 0); path.rLineTo(-w3/2, -(float) (h2*Math.sqrt(3)/2));


                    canvas.clipPath(path);
      Bitmap sourceBitmap = scaleBitmapImage;
      canvas.drawBitmap(sourceBitmap, 
                                    new Rect(0, 0, sourceBitmap.getWidth(),
        sourceBitmap.getHeight()), 
                                    new Rect(0, 0, targetWidth,
        targetHeight), null);
      return targetBitmap;
     }

في وقت متأخر من relpy .. ولكن نأمل أن يساعد شخص ما ...

  public Bitmap getHexagonShape(Bitmap scaleBitmapImage) {
    // TODO Auto-generated method stub
    int targetWidth = 200;
    int targetHeight =200;
    Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
            targetHeight,Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(targetBitmap);

    Path path = new Path();
    float stdW = 200;
    float stdH = 200;
    float w3 =stdW / 2;
    float h2 = stdH / 2;


    float radius=stdH/2-10;
    float triangleHeight = (float) (Math.sqrt(3) * radius / 2);
      float centerX = stdW/2;
      float centerY = stdH/2;
      path.moveTo(centerX, centerY + radius);
      path.lineTo(centerX - triangleHeight, centerY + radius/2);
      path.lineTo(centerX - triangleHeight, centerY - radius/2);
      path.lineTo(centerX, centerY - radius);
      path.lineTo(centerX + triangleHeight, centerY - radius/2);
      path.lineTo(centerX + triangleHeight, centerY + radius/2);
      path.moveTo(centerX, centerY + radius);


    canvas.clipPath(path);
    Bitmap sourceBitmap = scaleBitmapImage;
    canvas.drawBitmap(sourceBitmap, 
            new Rect(0, 0, sourceBitmap.getWidth(),
                    sourceBitmap.getHeight()), 
                    new Rect(0, 0, targetWidth,
                            targetHeight), null);
    return targetBitmap;
}




public static Bitmap drawableToBitmap (Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

اتصل بهذا المكان الذي تريد استخدامه

    Drawable drawable = getResources().getDrawable( R.drawable.placeholder );        
    Bitmap b=getHexagonShape(drawableToBitmap(drawable));
    img=(ImageView)findViewById(R.id.imageView);

    img.setImageBitmap(b);

لا أعرف ما إذا كان البروتوكول الاختياري قد حصل على الإجابة التي كان يبحث عنها ، ولكن هنا يذهب.

لقد قمت بإنشاء طريقة عرض مخصصة ، والتي تمتد ImageView ، والتي ستؤدي المهمة بالنسبة لك أفضل قليلا. الجواب هنا يخلق مجرد maks داخل ImageView ويجبرك على تعيين الصورة كخلفية

يتيح لك العرض الخاص بي تعيين الصورة مثل الصورة النقطية القياسية ، ويعالج CenterCrop وقياس الصورة. إنه يضع القناع في الواقع بدلاً منه ، وبنفس الحدود بالإضافة إلى الظل المسقط.

وإذا لم يكن ذلك كافيًا ، فيمكنك بسهولة إنشاء أشكال مخصصة ليتم تقديمها ، فكل ما عليك هو توسيع فئة RenderShape. (يتم تضمين 4 أشكال في المكتبة: الدائرة ، المثلث ، السداسي و المثمن)

إلقاء نظرة على جيثب بلدي

في صحتك


هناك بعض الأشياء التي يمكنك تجربتها:

  • قد ترغب في تجربة رسم 9 صور في أعلى صورتك.

  • هناك أيضا هذا توتو قصير من قبل رومان غي: http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/

    BitmapShader shader;
    shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(shader);
    
    RectF rect = new RectF(0.0f, 0.0f, width, height);
    
    // rect contains the bounds of the shape
    // radius is the radius in pixels of the rounded corners
    // paint contains the shader that will texture the shape
    canvas.drawRoundRect(rect, radius, radius, paint);
    

    بدلاً من استخدام أسلوب drawRoundRect() من القماش ، يمكنك محاولة استخدام drawPath() للحصول على الشكل المطلوب.

    آمل أن هذا يضعك في الاتجاه الصحيح.


يمكنك استخدام Android Shape ImageView بواسطة siamed.

https://github.com/siyamed/android-shape-imageview

<com.github.siyamed.shapeimageview.HexagonImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="8dp"
    android:src="@drawable/neo"
    app:siBorderWidth="8dp"
    app:siBorderColor="@color/darkgray"/>

يرجى قراءة الوثائق على جيثب ، تتوفر الكثير من الخيارات.







android-imageview