gif图片的自定义视图未按比例缩放到我希望

时间:2018-02-10 09:45:23

标签: android

我有问题扩展我的自定义视图PlayGifView我上网显示gif图像。我试图从imageView继承(通常是它的View)以便扩展它,但这是不可能的。它也没有考虑边际。奇怪的是我在我的适配器中有两种类型的项目要显示:输入和输出消息。对于类型,大小不同,但这应该显示与输出相同的东西。输出类型占据了屏幕的所有宽度。这两种类型都不能缩放。我需要帮助,我一直在寻找很长一段时间来解决这个问题。谢谢。 这是我的代码:

 public class MessagesAdapter extends BaseAdapter {

   public ArrayList<Message> listeMessages;
    Context wContext = null;

    public MessagesAdapter(ArrayList<Message> liste, Context context) {
        this.listeMessages = liste;
        this.wContext = context;
    }

    @Override
    public int getCount() {
        return listeMessages.size();
    }

    @Override
    public Object getItem(int position) {
        return listeMessages.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;
        Message message = (Message) getItem(position);

          int layoutRes=R.layout.listemessagese;

        if (convertView == null) {

            convertView = lInflater.inflate(layoutRes, null);

            viewHolder = new ViewHolder();

            viewHolder.mBody = (TextView) convertView.findViewById(R.id.text1);
            viewHolder.mBodyS = (TextView) convertView.findViewById(R.id.texts1);
            viewHolder.mDate = (TextView) convertView.findViewById(R.id.text2);
            viewHolder.bloc = (LinearLayout) convertView.findViewById(R.id.bloc);
            viewHolder.iconM = (ImageView) convertView.findViewById(R.id.men_icon);
            viewHolder.iconM2 = (ImageView) convertView.findViewById(R.id.men_icon2);

            convertView.setTag(viewHolder);
        } else
            viewHolder = (ViewHolder) convertView.getTag();


        Drawable drawable;
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        if(message.getType()==TYPE_SORTANT)
        {
            params2.gravity=Gravity.RIGHT;params.gravity=Gravity.RIGHT;
            params2.setMarginStart(70);params.setMarginStart(70);

        }else{
            params2.setMarginEnd(70);params.setMarginEnd(70);
        }
        RelativeLayout.LayoutParams paramsR = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        if (message.getTypeEnvoi() == TYPE_SMS) {
            if(message.getType()==TYPE_ENTRANT) {
                viewHolder.mBody.setVisibility(View.VISIBLE);
                viewHolder.mBodyS.setVisibility(View.GONE);
                viewHolder.iconM.setVisibility(View.VISIBLE);
                viewHolder.iconM2.setVisibility(View.GONE);
                viewHolder.mBody.setText(message.getBody());

            }else {
                viewHolder.mBody.setVisibility(View.GONE);
                viewHolder.mBodyS.setVisibility(View.VISIBLE);
                viewHolder.iconM.setVisibility(View.GONE);
                viewHolder.iconM2.setVisibility(View.VISIBLE);
                viewHolder.mBodyS.setText(message.getBody());
            }

            viewHolder.mDate.setText(convertDate(message.getDate(), "dd MMMM HH:mm  "));
            viewHolder.bloc.setVisibility(View.GONE);
        } else {

            viewHolder.mBody.setVisibility(View.GONE);
            viewHolder.mBodyS.setVisibility(View.GONE);
            viewHolder.mDate.setText(convertDate(message.getDate(), "dd MMMM HH:mm  "));

            if(message.getType()==TYPE_ENTRANT) {
                viewHolder.iconM.setVisibility(View.VISIBLE);
                viewHolder.iconM2.setVisibility(View.GONE);
            }else{
                viewHolder.iconM.setVisibility(View.GONE);
                viewHolder.iconM2.setVisibility(View.VISIBLE);
                viewHolder.mDate.setLayoutParams(params);
            }

            viewHolder.bloc.setVisibility(View.VISIBLE);
            viewHolder.bloc.removeAllViews();
            for (int i = 0; i < message.getBitmaps().size(); i++) {

                Bitmap bitmap = getMmsImage(message.getBitmaps().get(i), wContext);
                ImageView imageB = new ImageView(wContext);
                if (bitmap != null) {
                    //    imageB.setMaxHeight((bitmap.getHeight() / bitmap.getWidth()) * 100);
                     //  imageB.setMaxWidth(100);
                    imageB.setImageBitmap(bitmap);
                    imageB.setLayoutParams(params);

                    viewHolder.bloc.addView(imageB);
                }
            }
                for (int i = 0; i < message.getImageGifs().size(); i++) {
                    PlayGifView gifView = getGifImage(message.getImageGifs().get(i), wContext);
                    gifView.setLayoutParams(params2);
                    gifView.setScaleType(ImageView.ScaleType.FIT_XY);
                    gifView.setMaxHeight(50);
                    gifView.setMaxWidth(50);
                    gifView.setAdjustViewBounds(true);
                    viewHolder.bloc.addView(gifView);

                }

                for (int i = 0; i < message.getTabText().size(); i++) {
                    String textMms = message.getTabText().get(i);
                    TextView text = new TextView(wContext);
                    text.setText(textMms);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        if(message.getTypeEnvoi()==TYPE_ENTRANT)
                            drawable = wContext.getDrawable(R.drawable.bubble_yellow3);
                        else
                            drawable = wContext.getDrawable(R.drawable.bubble_blue);
                    } else {
                        if(message.getTypeEnvoi()==TYPE_ENTRANT)
                        drawable = wContext.getResources().getDrawable(R.drawable.bubble_yellow3);
                        else
                        drawable = wContext.getResources().getDrawable(R.drawable.bubble_blue);
                    }
                    text.setBackground(drawable);
                    text.setLayoutParams(params);
                    viewHolder.bloc.addView(text);
                }

            }

        return convertView;
    }
}

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:id="@+id/typeE">

    <ImageView
        android:id="@+id/men_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/menb_icon"
        />

    <LinearLayout
        android:id="@+id/wrapper"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="70dip"
        android:layout_marginRight="70dip"
        android:layout_marginTop="6dip"
        android:paddingEnd="20dip"
        android:paddingRight="20dip"
        android:background="@drawable/bubble_yellow3"
        />

        <TextView 
        android:id="@+id/texts1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bubble_blue"
        android:textColor="#FFFFFF"
        android:layout_gravity="right"
        android:layout_marginStart="70dip"
        android:layout_marginLeft="70dip"
        android:paddingStart="20dip"
        android:paddingLeft="20dip"
        />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/bloc"
            android:orientation="vertical">

        </LinearLayout>

        <ImageView
            android:id="@+id/men_icon2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/mendb_icon"
            android:layout_gravity="right"
            />

        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/grey_eff"
            />

    </LinearLayout>

</LinearLayout>

编辑:忘了PlayGifView:

public class PlayGifView extends ImageView {

private static final int DEFAULT_MOVIEW_DURATION = 1000;

private Movie mMovie;

private long mMovieStart = 0;
private int mCurrentAnimationTime = 0;

@SuppressLint("NewApi")
public PlayGifView(Context context, AttributeSet attrs) {
    super(context, attrs);

    /**
     * Starting from HONEYCOMB have to turn off HardWare acceleration to draw
     * Movie on Canvas.
     */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
}

public void setImageResource(InputStream is){
    mMovie = Movie.decodeStream(is);
    requestLayout();
}



@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(mMovie != null){
        setMeasuredDimension(mMovie.width(), mMovie.height());
    }else{
        setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
    }
}

@Override
protected void onDraw(Canvas canvas) {
    if (mMovie != null){
        updateAnimtionTime();
        drawGif(canvas);
        invalidate();
    }else{
        drawGif(canvas);
    }//this changes according to screen size
}

private void updateAnimtionTime() {
    long now = android.os.SystemClock.uptimeMillis();

    if (mMovieStart == 0) {
        mMovieStart = now;
    }
    int dur = mMovie.duration();
    if (dur == 0) {
        dur = DEFAULT_MOVIEW_DURATION;
    }
    mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
}

private void drawGif(Canvas canvas) {
    mMovie.setTime(mCurrentAnimationTime);
    mMovie.draw(canvas, 0, 0);
    canvas.restore();
}

}

0 个答案:

没有答案