我有问题扩展我的自定义视图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();
}
}