ImageCardView.java revision 70acb0c19be3831a2080e4f902324de16bfbf62e
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.widget; 15 16import android.content.Context; 17import android.content.res.TypedArray; 18import android.graphics.drawable.Drawable; 19import android.support.annotation.ColorInt; 20import android.support.v17.leanback.R; 21import android.text.TextUtils; 22import android.util.AttributeSet; 23import android.view.LayoutInflater; 24import android.view.View; 25import android.view.ViewGroup; 26import android.widget.ImageView; 27import android.widget.ImageView.ScaleType; 28import android.widget.TextView; 29 30/** 31 * A card view with an {@link ImageView} as its main region. 32 */ 33public class ImageCardView extends BaseCardView { 34 35 private ImageView mImageView; 36 private View mInfoArea; 37 private TextView mTitleView; 38 private TextView mContentView; 39 private ImageView mBadgeImage; 40 private ImageView mBadgeFadeMask; 41 private boolean mAttachedToWindow; 42 43 public ImageCardView(Context context) { 44 this(context, null); 45 } 46 47 public ImageCardView(Context context, AttributeSet attrs) { 48 this(context, attrs, R.attr.imageCardViewStyle); 49 } 50 51 public ImageCardView(Context context, AttributeSet attrs, int defStyle) { 52 super(context, attrs, defStyle); 53 54 LayoutInflater inflater = LayoutInflater.from(context); 55 View v = inflater.inflate(R.layout.lb_image_card_view, this); 56 57 mImageView = (ImageView) v.findViewById(R.id.main_image); 58 mImageView.setVisibility(View.INVISIBLE); 59 mInfoArea = v.findViewById(R.id.info_field); 60 mTitleView = (TextView) v.findViewById(R.id.title_text); 61 mContentView = (TextView) v.findViewById(R.id.content_text); 62 mBadgeImage = (ImageView) v.findViewById(R.id.extra_badge); 63 mBadgeFadeMask = (ImageView) v.findViewById(R.id.fade_mask); 64 65 if (mInfoArea != null) { 66 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.lbImageCardView, 67 defStyle, 0); 68 try { 69 setInfoAreaBackground( 70 a.getDrawable(R.styleable.lbImageCardView_infoAreaBackground)); 71 } finally { 72 a.recycle(); 73 } 74 } 75 } 76 77 public final ImageView getMainImageView() { 78 return mImageView; 79 } 80 81 public void setMainImageAdjustViewBounds(boolean adjustViewBounds) { 82 if (mImageView != null) { 83 mImageView.setAdjustViewBounds(adjustViewBounds); 84 } 85 } 86 87 public void setMainImageScaleType(ScaleType scaleType) { 88 if (mImageView != null) { 89 mImageView.setScaleType(scaleType); 90 } 91 } 92 93 /** 94 * Set drawable with fade-in animation. 95 */ 96 public void setMainImage(Drawable drawable) { 97 setMainImage(drawable, true); 98 } 99 100 /** 101 * Set drawable with optional fade-in animation. 102 */ 103 public void setMainImage(Drawable drawable, boolean fade) { 104 if (mImageView == null) { 105 return; 106 } 107 108 mImageView.setImageDrawable(drawable); 109 if (drawable == null) { 110 mImageView.animate().cancel(); 111 mImageView.setAlpha(1f); 112 mImageView.setVisibility(View.INVISIBLE); 113 } else { 114 mImageView.setVisibility(View.VISIBLE); 115 if (fade) { 116 fadeIn(); 117 } else { 118 mImageView.animate().cancel(); 119 mImageView.setAlpha(1f); 120 } 121 } 122 } 123 124 public void setMainImageDimensions(int width, int height) { 125 ViewGroup.LayoutParams lp = mImageView.getLayoutParams(); 126 lp.width = width; 127 lp.height = height; 128 mImageView.setLayoutParams(lp); 129 } 130 131 public Drawable getMainImage() { 132 if (mImageView == null) { 133 return null; 134 } 135 136 return mImageView.getDrawable(); 137 } 138 139 public Drawable getInfoAreaBackground() { 140 if (mInfoArea != null) { 141 return mInfoArea.getBackground(); 142 } 143 return null; 144 } 145 146 public void setInfoAreaBackground(Drawable drawable) { 147 if (mInfoArea != null) { 148 mInfoArea.setBackground(drawable); 149 if (mBadgeImage != null) { 150 mBadgeImage.setBackground(drawable); 151 } 152 } 153 } 154 155 public void setInfoAreaBackgroundColor(@ColorInt int color) { 156 if (mInfoArea != null) { 157 mInfoArea.setBackgroundColor(color); 158 if (mBadgeImage != null) { 159 mBadgeImage.setBackgroundColor(color); 160 } 161 } 162 } 163 164 public void setTitleText(CharSequence text) { 165 if (mTitleView == null) { 166 return; 167 } 168 169 mTitleView.setText(text); 170 setTextMaxLines(); 171 } 172 173 public CharSequence getTitleText() { 174 if (mTitleView == null) { 175 return null; 176 } 177 178 return mTitleView.getText(); 179 } 180 181 public void setContentText(CharSequence text) { 182 if (mContentView == null) { 183 return; 184 } 185 186 mContentView.setText(text); 187 setTextMaxLines(); 188 } 189 190 public CharSequence getContentText() { 191 if (mContentView == null) { 192 return null; 193 } 194 195 return mContentView.getText(); 196 } 197 198 public void setBadgeImage(Drawable drawable) { 199 if (mBadgeImage == null) { 200 return; 201 } 202 203 if (drawable != null) { 204 mBadgeImage.setImageDrawable(drawable); 205 mBadgeImage.setVisibility(View.VISIBLE); 206 mBadgeFadeMask.setVisibility(View.VISIBLE); 207 } else { 208 mBadgeImage.setVisibility(View.GONE); 209 mBadgeFadeMask.setVisibility(View.GONE); 210 } 211 } 212 213 public Drawable getBadgeImage() { 214 if (mBadgeImage == null) { 215 return null; 216 } 217 218 return mBadgeImage.getDrawable(); 219 } 220 221 private void fadeIn() { 222 mImageView.setAlpha(0f); 223 if (mAttachedToWindow) { 224 mImageView.animate().alpha(1f).setDuration(mImageView.getResources().getInteger( 225 android.R.integer.config_shortAnimTime)); 226 } 227 } 228 229 @Override 230 public boolean hasOverlappingRendering() { 231 return false; 232 } 233 234 private void setTextMaxLines() { 235 if (TextUtils.isEmpty(getTitleText())) { 236 mContentView.setMaxLines(2); 237 } else { 238 mContentView.setMaxLines(1); 239 } 240 if (TextUtils.isEmpty(getContentText())) { 241 mTitleView.setMaxLines(2); 242 } else { 243 mTitleView.setMaxLines(1); 244 } 245 } 246 247 @Override 248 protected void onAttachedToWindow() { 249 super.onAttachedToWindow(); 250 mAttachedToWindow = true; 251 if (mImageView.getAlpha() == 0) { 252 fadeIn(); 253 } 254 } 255 256 @Override 257 protected void onDetachedFromWindow() { 258 mAttachedToWindow = false; 259 mImageView.animate().cancel(); 260 mImageView.setAlpha(1f); 261 super.onDetachedFromWindow(); 262 } 263} 264