知识很基础……

前几天买了个单反,特别想拍B门长时间曝光的效果。后来想想不如自己写个APP,实现屏幕背景的随机颜色以及全屏显示文字。

先上图:

这两张图片的左侧都很亮,这是因为APP里面忘记把"状态栏"隐藏了。两张照片的快门都是30s,APP的基本功能就是设定好文字,点击屏幕就会显示一个字;再点击屏幕编程黑色;再次点击屏幕出现下一个字。我在屏幕全黑的时候移动手机,到合适位置点击屏幕,显示出下一个字。同时屏幕还能够按照设定的时间间隔,显示出随机的颜色。为了使显示的颜色更鲜艳,在RGB颜色合成的时候,RGB的随机值都是从80~255。

同时文字在显示的时候,角度从45°到135°随机出现,这要在拍照时手机正常摆放,也不至于太过呆板。

下面是APP截图:

运行时的截图:

程序代码如下:

package com.example.raw;

import java.util.Timer;
import java.util.TimerTask; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView; public class MainActivity extends Activity { public int redColor = 0;
public int blueColor = 0;
public int greenColor = 0; public int tvRedColor = 0;
public int tvBlueColor = 0;
public int tvGreenColor = 0; public int tvRotation = 0;
public int clickTimes = 0;
public int i = 0; public char[] text = null; public boolean enableView = false; private LinearLayout ll;
private TimerTask task;
private Button btnTimeInterval, btnSetText;
private TextView etTimeInterval, editSetText, tvFullScreen, tvScreenLight;
private SeekBar seekBar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setMax(100); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = (float) (progress / 100.0);
getWindow().setAttributes(lp);
}
}); ll = (LinearLayout) findViewById(R.id.root);
ll.setBackgroundColor(0XFFFFFFFF); btnTimeInterval = (Button) findViewById(R.id.btnTimeInterval);
btnSetText = (Button) findViewById(R.id.btnSetText); etTimeInterval = (TextView) findViewById(R.id.etTimeInterval);
editSetText = (TextView) findViewById(R.id.editSetText);
tvFullScreen = (TextView) findViewById(R.id.tvFullScreen);
tvScreenLight = (TextView) findViewById(R.id.tvScreenLight); final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
redColor = (int) (80 + Math.random() * 175);
blueColor = (int) (80 + Math.random() * 175);
greenColor = (int) (80 + Math.random() * 175);
ll.setBackgroundColor(0xff000000 + redColor * 255 * 255
+ blueColor * 255 + greenColor);
break;
default:
break;
}
super.handleMessage(msg);
}
}; btnTimeInterval.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try {
if (etTimeInterval.getText() != null) {
setAllUiVisibilityGone();
tvFullScreen.setVisibility(8);
Timer timer = new Timer(true);
timer.schedule(task, 1000, Integer
.parseInt(etTimeInterval.getText().toString()));
} } catch (Exception e) { } }
}); btnSetText.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try {
if (editSetText.getText() != null) {
setAllUiVisibilityGone();
text = editSetText.getText().toString().toCharArray();
tvFullScreen.setBackgroundColor(0xff000000);
ll.setBackgroundColor(0xff000000);
enableView = true;
} } catch (Exception e) {
// TODO: handle exception
}
}
}); ll.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {
if (enableView == true) {
clickTimes++;
if (clickTimes % 2 == 1) {
tvFullScreen.setBackgroundColor(0xff000000);
ll.setBackgroundColor(0xff000000); tvRotation = (int) (45 + Math.random() * 90);
tvFullScreen.setRotation(tvRotation); tvRedColor = (int) (100 + Math.random() * 155);
tvBlueColor = (int) (100 + Math.random() * 155);
tvGreenColor = (int) (100 + Math.random() * 155);
tvFullScreen.setTextColor(0xff000000 + tvRedColor * 255
* 255 + tvBlueColor * 255 + tvGreenColor); if (i < text.length) {
tvFullScreen.setText(text, i++, 1);
} else {
tvFullScreen.setTextColor(0xff000000);
} } else {
tvFullScreen.setBackgroundColor(0xff000000);
tvFullScreen.setTextColor(0xff000000);
ll.setBackgroundColor(0xff000000);
}
}
}
}); task = new TimerTask() { @Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}; } public void setAllUiVisibilityGone() {
btnTimeInterval.setVisibility(8);
etTimeInterval.setVisibility(8);
btnSetText.setVisibility(8);
editSetText.setVisibility(8);
seekBar.setVisibility(8);
tvScreenLight.setVisibility(8);
}
}

MainActivity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"
android:orientation="vertical"
tools:context="com.example.raw.MainActivity" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/etTimeInterval"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="输入时间间隔"
android:inputType="numberDecimal" > <requestFocus />
</EditText> <Button
android:id="@+id/btnTimeInterval"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="设定间隔" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/editSetText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="输入文字" /> <Button
android:id="@+id/btnSetText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="设定文字" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <SeekBar
android:id="@+id/seekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2" /> <TextView
android:id="@+id/tvScreenLight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="屏幕亮度"
android:layout_weight="3"
android:gravity="center"
android:textSize="20sp"/>
</LinearLayout> <TextView
android:id="@+id/tvFullScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text=""
android:textSize="280sp" /> </LinearLayout>

XML文件

19_B门长时曝光APP的更多相关文章

  1. 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast

    [源码下载] 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast 作者:webabcd 介绍背水一战 ...

  2. html中使用js实现内容过长时部分

    有时数据内容太长时我们并不希望其全部显示出来,因为这样可能会导致用于显示这些内容的标签被撑开影响美观. 这时就希望能够实现默认只显示部分内容,在鼠标放上去的时候再将全部的内容显示出来. 这里提供一个简 ...

  3. iOS设置文字过长时的显示格式

    以label为例: //设置文字过长时的显示格式 aLabel.lineBreakMode = UILineBreakModeMiddleTruncation; //截去中间 aLabel.lineB ...

  4. HTML中文本过长时自动隐藏末尾部分或中间等任意部分

    一.    一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px;                      ...

  5. c# c/s 框架读取的配置文件时是app.exe.config

    c# c/s 框架读取的配置文件时是app.exe.config, 一般在bin中间中俄debug中或者Release中

  6. echarts pie 图表当名称太长时

    当饼图的名称太长时,只显示几个字符,其余的... let use; use.setOption({ tooltip: { trigger: 'item', formatter: "{a} & ...

  7. 返回xml过长时被nginx截断的解决办法

    返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...

  8. UILabel标签文字过长时的显示方式

    lineBreakMode:设置标签文字过长时的显示方式. label.lineBreakMode = NSLineBreakByCharWrapping; //以字符为显示单位显示,后面部分省略不显 ...

  9. 当td中文字过长时,显示为省略号

    当表格中的文字过长时,可选择已省略号显示.这里是用js实现的.首先获取td中的文字长度(innerText.length),如果长度超过了设定的长度,则截取内容,加上省略号显示.示例代码如下: $(f ...

随机推荐

  1. Java学习的第四十八天

    1.例8.4找出整形数组中的最大值 import java.util.Scanner; public class Cjava { public static void main(String[]arg ...

  2. python重要第三方库pandas加载数据(详解)

    Pandas数据加载 关注公众号"轻松学编程"了解更多. pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中read_csv和read_table这两个 ...

  3. C# 泛型的协变

    class Program { static void Main(string[] args) { Person person = new Person(); Person chinese2 = ne ...

  4. C++语言学习之STL 的组成

    STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有S ...

  5. Git撤销文件修改

    在旧版本中,git的撤销工作区的文件修改是用git checkout -- <file>命令,由于容易漏了--导致和切换分支混肴,所以新版本中: - 使用git restore (--wo ...

  6. 转载:WIFI无线协议802.11a/b/g/n/ac的演变以及区别

    WIFI无线协议802.11a/b/g/n/ac的演变以及区别 版权声明:版权所有,转载须注明出处. https://blog.csdn.net/Brouce__Lee/article/details ...

  7. 21迁移python项目到另一台电脑

    在虚拟环境中将第三方库打包到一个TXT文件:1,在项目保存在项目所在目录,文件可以自定义.pip freeze> requirements.txt命令2,将requirements.txt放入另 ...

  8. 它是世界上最好的语言,吊打PHP那种

    Scratch Scratch是麻省理工媒体实验室终身幼稚园组开发的一套电脑程序开发平台,旨在让程序设计语言初学者不需先学习语言语法便能设计产品.开发者期望通过学习Scratch,启发和激励用户在愉快 ...

  9. 第05组 Alpha冲刺 (4/6)(组长)

    .th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...

  10. c语言: 错误:只允许在 C99 模式下使用‘for’循环初始化声明 用gcc编译出现

    在gcc编译中如果使用 for(int i=0;i<n;++i){}会提示错误 错误:只允许在 C99 模式下使用'for'循环初始化声明 用gcc编译出现 就是说你的你的c编译器不是c99标准 ...