[英]Android: Create a mirror image of a view
我編寫了一個代碼,該代碼反映了啟動活動中ImageView的視圖。 為了實現這一點,我采取了三個步驟。
這是代碼。
public class SplashActivity extends Activity {
private ImageView ivLogo;
private SharedPreferences appPreferences;
private Typeface typeface;
private TextView tvAppName;
private boolean isAppInstalled = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
String appName = getResources().getString(R.string.app_name);
appPreferences = PreferenceManager.getDefaultSharedPreferences(this);
isAppInstalled = appPreferences.getBoolean("isAppInstalled", false);
if(isAppInstalled == false) {
Intent shortcutIntent = new Intent(getApplicationContext(), SplashActivity.class);
shortcutIntent.setAction(Intent.ACTION_MAIN);
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.mipmap.ic_launcher));
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(intent);
SharedPreferences.Editor editor = appPreferences.edit();
editor.putBoolean("isAppInstalled", true);
editor.commit();
}
// Set the app name's font
typeface = Typeface.createFromAsset(getAssets(), "fonts/Catull.ttf");
tvAppName = (TextView) findViewById(R.id.tvAppName);
tvAppName.setTypeface(typeface);
Bitmap originalImage = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_gruppo);
ivLogo = new ImageView(this);
ivLogo.setImageBitmap(getReflection(originalImage));
Handler hd = new Handler();
hd.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(getApplicationContext(), InitialActivity.class);
startActivity(intent);
// Implement the animation on activity change
overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out);
finish();
}
}, 1200);
}
public Bitmap getReflection(Bitmap image) {
// The gap we want between the reflection and the original image
final int reflectionGap = 4;
// Get the bitmap from the mipmap folder
Bitmap originalImage = image;
int width = originalImage.getWidth();
int height = originalImage.getHeight();
// This will not scale but will flip on the Y axis
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
// Create a Bitmap with the flip matrix applied to it.
// We only want the bottom half of the image
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
height / 2, width, height / 2, matrix, false);
// Create a new bitmap with same width but taller to fit reflection
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / 2), Bitmap.Config.ARGB_8888);
// Create a new Canvas with the bitmap that's big enough for
// the image plus gap plus reflection
Canvas canvas = new Canvas(bitmapWithReflection);
// Draw in the original image
canvas.drawBitmap(originalImage, 0, 0, null);
//Draw the reflection Image
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
// Create a shader that is a linear gradient that covers the reflection
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
// Set the paint to use this shader (linear gradient)
paint.setShader(shader);
// Set the Transfer mode to be porter duff and destination in
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
// Draw a rectangle using the paint with our linear gradient
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
return bitmapWithReflection;
}
}
但是在運行該應用程序時,我看不到反射的圖像,而只看到普通的圖像。 代碼有問題嗎?
問題總是發生在很小的事情上。 這里的問題是ivLogo變量沒有添加到內容視圖中。 因此,必須將ivLogo這樣添加到onCreate方法中,
ivLogo = (ImageView) findViewById(R.id.ivLogo);
代替
ivLogo = new ImageView();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.